mirror of
https://github.com/OMGeeky/google-apis-rs.git
synced 2026-02-23 15:49:49 +01:00
Fix default values in CLI crates
This commit is contained in:
@@ -6,6 +6,8 @@ import collections
|
||||
from copy import deepcopy
|
||||
from random import (randint, random, choice)
|
||||
|
||||
from generator.lib import types
|
||||
|
||||
SPLIT_START = '>>>>>>>'
|
||||
SPLIT_END = '<<<<<<<'
|
||||
|
||||
@@ -56,7 +58,7 @@ JSON_TYPE_RND_MAP = {'boolean': lambda: str(bool(randint(0, 1))).lower(),
|
||||
'number' : lambda: random(),
|
||||
'int32' : lambda: randint(-101, -1),
|
||||
'int64' : lambda: randint(-101, -1),
|
||||
'string': lambda: '%s' % choice(util.words).lower()}
|
||||
'string': lambda: '%s' % choice(types.WORDS).lower()}
|
||||
|
||||
JSON_TYPE_TO_ENUM_MAP = {'boolean' : 'Boolean',
|
||||
'integer' : 'Int',
|
||||
@@ -74,17 +76,6 @@ CTYPE_TO_ENUM_MAP = {CTYPE_POD: 'Pod',
|
||||
CTYPE_ARRAY: 'Vec',
|
||||
CTYPE_MAP: 'Map'}
|
||||
|
||||
JSON_TYPE_VALUE_MAP = {'boolean': 'false',
|
||||
'integer' : '-0',
|
||||
'uint32' : '0',
|
||||
'uint64' : '0',
|
||||
'float' : '0.0',
|
||||
'double' : '0.0',
|
||||
'number' : '0.0',
|
||||
'int32' : '-0',
|
||||
'int64' : '-0',
|
||||
'string': ''}
|
||||
|
||||
assert len(set(JSON_TYPE_RND_MAP.keys()) ^ POD_TYPES) == 0
|
||||
|
||||
def new_method_context(resource, method, c):
|
||||
|
||||
97
src/generator/lib/types.py
Normal file
97
src/generator/lib/types.py
Normal file
@@ -0,0 +1,97 @@
|
||||
from .rust_type import Base, HashMap, Vec
|
||||
from random import randint, random, choice, seed
|
||||
|
||||
seed(1337)
|
||||
|
||||
WORDS = [
|
||||
w.strip(',') for w in
|
||||
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.".split(
|
||||
' ')]
|
||||
|
||||
|
||||
def chrono_date(y=None, m=None, d=None):
|
||||
y = randint(1, 9999) if y is None else y
|
||||
m = randint(1, 12) if m is None else m
|
||||
d = randint(1, 31) if d is None else d
|
||||
return f"chrono::NaiveDate::from_ymd({y}, {m}, {d})"
|
||||
|
||||
|
||||
CHRONO_PATH = "client::chrono"
|
||||
CHRONO_DATETIME = f"{CHRONO_PATH}::DateTime<{CHRONO_PATH}::offset::Utc>"
|
||||
CHRONO_DATE = f"{CHRONO_PATH}::NaiveDate"
|
||||
USE_FORMAT = 'use_format_field'
|
||||
CHRONO_UTC_NOW = "chrono::Utc::now()"
|
||||
|
||||
RUST_TYPE_MAP = {
|
||||
'boolean': Base("bool"),
|
||||
'integer': USE_FORMAT,
|
||||
'number': USE_FORMAT,
|
||||
'uint32': Base("u32"),
|
||||
'double': Base("f64"),
|
||||
'float': Base("f32"),
|
||||
'int32': Base("i32"),
|
||||
'any': Base("String"), # TODO: Figure out how to handle it. It's 'interface' in Go ...
|
||||
'int64': Base("i64"),
|
||||
'uint64': Base("u64"),
|
||||
'array': Vec(None),
|
||||
'string': Base("String"),
|
||||
'object': HashMap(None, None),
|
||||
# https://github.com/protocolbuffers/protobuf/blob/ec1a70913e5793a7d0a7b5fbf7e0e4f75409dd41/src/google/protobuf/timestamp.proto
|
||||
# In JSON format, the Timestamp type is encoded as a string in the [RFC 3339] format
|
||||
'google-datetime': Base(CHRONO_DATETIME),
|
||||
# Per .json files: RFC 3339 timestamp
|
||||
'date-time': Base(CHRONO_DATETIME),
|
||||
# Per .json files: A date in RFC 3339 format with only the date part
|
||||
# e.g. "2013-01-15"
|
||||
'date': Base(CHRONO_DATE),
|
||||
# https://github.com/protocolbuffers/protobuf/blob/ec1a70913e5793a7d0a7b5fbf7e0e4f75409dd41/src/google/protobuf/duration.proto
|
||||
'google-duration': Base(f"{CHRONO_PATH}::Duration"),
|
||||
# guessing bytes is universally url-safe b64
|
||||
"byte": Vec(Base("u8")),
|
||||
# https://github.com/protocolbuffers/protobuf/blob/ec1a70913e5793a7d0a7b5fbf7e0e4f75409dd41/src/google/protobuf/field_mask.proto
|
||||
"google-fieldmask": Base("client::FieldMask")
|
||||
}
|
||||
|
||||
RUST_TYPE_RND_MAP = {
|
||||
'bool': lambda: str(bool(randint(0, 1))).lower(),
|
||||
'u32': lambda: randint(0, 100),
|
||||
'u64': lambda: randint(0, 100),
|
||||
'f64': lambda: random(),
|
||||
'f32': lambda: random(),
|
||||
'i32': lambda: randint(-101, -1),
|
||||
'i64': lambda: randint(-101, -1),
|
||||
'String': lambda: '"%s"' % choice(WORDS),
|
||||
'&str': lambda: '"%s"' % choice(WORDS),
|
||||
'&Vec<String>': lambda: '&vec!["%s".into()]' % choice(WORDS),
|
||||
"Vec<u8>": lambda: f"vec![0, 1, 2, 3]",
|
||||
# why a reference to Vec? Because it works. Should be slice, but who knows how typing works here.
|
||||
"&Vec<u8>": lambda: f"&vec![0, 1, 2, 3]",
|
||||
# TODO: styling this
|
||||
f"{CHRONO_PATH}::Duration": lambda: f"chrono::Duration::seconds({randint(0, 9999999)})",
|
||||
CHRONO_DATE: chrono_date,
|
||||
CHRONO_DATETIME: lambda: CHRONO_UTC_NOW,
|
||||
"FieldMask": lambda: f"FieldMask(vec![{choice(WORDS)}])",
|
||||
}
|
||||
|
||||
JSON_TO_RUST_DEFAULT = {
|
||||
'boolean': 'false',
|
||||
'uint32': '0',
|
||||
'uint64': '0',
|
||||
'int32': "-0",
|
||||
'int64': "-0",
|
||||
'float': '0.0',
|
||||
'double': '0.0',
|
||||
'string': "\"\"",
|
||||
'google-datetime': CHRONO_UTC_NOW,
|
||||
'date-time': CHRONO_UTC_NOW,
|
||||
'date': chrono_date(2000, 1, 1),
|
||||
# https://github.com/protocolbuffers/protobuf/blob/ec1a70913e5793a7d0a7b5fbf7e0e4f75409dd41/src/google/protobuf/duration.proto
|
||||
'google-duration': "chrono::Duration::seconds(0)",
|
||||
# guessing bytes is universally url-safe b64
|
||||
"byte": "b\"hello world\"",
|
||||
# https://github.com/protocolbuffers/protobuf/blob/ec1a70913e5793a7d0a7b5fbf7e0e4f75409dd41/src/google/protobuf/field_mask.proto
|
||||
"google-fieldmask": "FieldMask::default()"
|
||||
}
|
||||
|
||||
|
||||
assert set(JSON_TO_RUST_DEFAULT.keys()).issubset(set(RUST_TYPE_MAP.keys()))
|
||||
@@ -3,12 +3,10 @@ import re
|
||||
import subprocess
|
||||
|
||||
from dataclasses import dataclass
|
||||
from random import (randint, random, choice, seed)
|
||||
from typing import Any, Dict, List, Mapping, Tuple
|
||||
from copy import deepcopy
|
||||
from .rust_type import Base, Box, HashMap, Vec, Option, RustType
|
||||
|
||||
seed(1337)
|
||||
from .types import RUST_TYPE_MAP, RUST_TYPE_RND_MAP
|
||||
|
||||
re_linestart = re.compile('^', flags=re.MULTILINE)
|
||||
re_spaces_after_newline = re.compile('^ {4}', flags=re.MULTILINE)
|
||||
@@ -20,40 +18,7 @@ re_desc_parts = re.compile(
|
||||
re_find_replacements = re.compile(r"\{[/\+]?\w+\*?\}")
|
||||
|
||||
HTTP_METHODS = set(("OPTIONS", "GET", "POST", "PUT", "DELETE", "HEAD", "TRACE", "CONNECT", "PATCH"))
|
||||
CHRONO_PATH = "client::chrono"
|
||||
CHRONO_DATETIME = f"{CHRONO_PATH}::DateTime<{CHRONO_PATH}::offset::Utc>"
|
||||
CHRONO_DATE = f"{CHRONO_PATH}::NaiveDate"
|
||||
USE_FORMAT = 'use_format_field'
|
||||
|
||||
RUST_TYPE_MAP = {
|
||||
'boolean': Base("bool"),
|
||||
'integer': USE_FORMAT,
|
||||
'number': USE_FORMAT,
|
||||
'uint32': Base("u32"),
|
||||
'double': Base("f64"),
|
||||
'float': Base("f32"),
|
||||
'int32': Base("i32"),
|
||||
'any': Base("String"), # TODO: Figure out how to handle it. It's 'interface' in Go ...
|
||||
'int64': Base("i64"),
|
||||
'uint64': Base("u64"),
|
||||
'array': Vec(None),
|
||||
'string': Base("String"),
|
||||
'object': HashMap(None, None),
|
||||
# https://github.com/protocolbuffers/protobuf/blob/ec1a70913e5793a7d0a7b5fbf7e0e4f75409dd41/src/google/protobuf/timestamp.proto
|
||||
# In JSON format, the Timestamp type is encoded as a string in the [RFC 3339] format
|
||||
'google-datetime': Base(CHRONO_DATETIME),
|
||||
# Per .json files: RFC 3339 timestamp
|
||||
'date-time': Base(CHRONO_DATETIME),
|
||||
# Per .json files: A date in RFC 3339 format with only the date part
|
||||
# e.g. "2013-01-15"
|
||||
'date': Base(CHRONO_DATE),
|
||||
# https://github.com/protocolbuffers/protobuf/blob/ec1a70913e5793a7d0a7b5fbf7e0e4f75409dd41/src/google/protobuf/duration.proto
|
||||
'google-duration': Base(f"{CHRONO_PATH}::Duration"),
|
||||
# guessing bytes is universally url-safe b64
|
||||
"byte": Vec(Base("u8")),
|
||||
# https://github.com/protocolbuffers/protobuf/blob/ec1a70913e5793a7d0a7b5fbf7e0e4f75409dd41/src/google/protobuf/field_mask.proto
|
||||
"google-fieldmask": Base("client::FieldMask")
|
||||
}
|
||||
|
||||
RESERVED_WORDS = set(('abstract', 'alignof', 'as', 'become', 'box', 'break', 'const', 'continue', 'crate', 'do',
|
||||
'else', 'enum', 'extern', 'false', 'final', 'fn', 'for', 'if', 'impl', 'in', 'let', 'loop',
|
||||
@@ -61,35 +26,8 @@ RESERVED_WORDS = set(('abstract', 'alignof', 'as', 'become', 'box', 'break', 'co
|
||||
'return', 'sizeof', 'static', 'self', 'struct', 'super', 'true', 'trait', 'type', 'typeof',
|
||||
'unsafe', 'unsized', 'use', 'virtual', 'where', 'while', 'yield'))
|
||||
|
||||
words = [w.strip(',') for w in
|
||||
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.".split(
|
||||
' ')]
|
||||
|
||||
|
||||
def chrono_date():
|
||||
return f"chrono::NaiveDate::from_ymd({randint(1, 9999)}, {randint(1, 12)}, {randint(1, 31)})"
|
||||
|
||||
|
||||
RUST_TYPE_RND_MAP = {
|
||||
'bool': lambda: str(bool(randint(0, 1))).lower(),
|
||||
'u32': lambda: randint(0, 100),
|
||||
'u64': lambda: randint(0, 100),
|
||||
'f64': lambda: random(),
|
||||
'f32': lambda: random(),
|
||||
'i32': lambda: randint(-101, -1),
|
||||
'i64': lambda: randint(-101, -1),
|
||||
'String': lambda: '"%s"' % choice(words),
|
||||
'&str': lambda: '"%s"' % choice(words),
|
||||
'&Vec<String>': lambda: '&vec!["%s".into()]' % choice(words),
|
||||
"Vec<u8>": lambda: f"vec![0, 1, 2, 3]",
|
||||
# why a reference to Vec? Because it works. Should be slice, but who knows how typing works here.
|
||||
"&Vec<u8>": lambda: f"&vec![0, 1, 2, 3]",
|
||||
# TODO: styling this
|
||||
f"{CHRONO_PATH}::Duration": lambda: f"chrono::Duration::seconds({randint(0, 9999999)})",
|
||||
CHRONO_DATE: chrono_date,
|
||||
CHRONO_DATETIME: lambda: f"chrono::Utc::now()",
|
||||
"FieldMask": lambda: f"FieldMask(vec![{choice(words)}])",
|
||||
}
|
||||
TREF = '$ref'
|
||||
IO_RESPONSE = 'response'
|
||||
IO_REQUEST = 'request'
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
ADD_SCOPE_FN, TREF, enclose_in)
|
||||
from generator.lib.cli import (mangle_subcommand, new_method_context, PARAM_FLAG, STRUCT_FLAG, OUTPUT_FLAG, VALUE_ARG,
|
||||
CONFIG_DIR, SCOPE_FLAG, is_request_value_property, FIELD_SEP, docopt_mode, FILE_ARG, MIME_ARG, OUT_ARG,
|
||||
call_method_ident, POD_TYPES, opt_value, ident, JSON_TYPE_VALUE_MAP,
|
||||
call_method_ident, POD_TYPES, opt_value, ident,
|
||||
KEY_VALUE_ARG, to_cli_schema, SchemaEntry, CTYPE_POD, actual_json_type, CTYPE_MAP, CTYPE_ARRAY,
|
||||
application_secret_path, CONFIG_DIR_FLAG, req_value, MODE_ARG,
|
||||
opt_values, SCOPE_ARG, CONFIG_DIR_ARG, DEFAULT_MIME, field_vec, comma_sep_fields, JSON_TYPE_TO_ENUM_MAP,
|
||||
CTYPE_TO_ENUM_MAP)
|
||||
|
||||
from generator.lib.types import JSON_TO_RUST_DEFAULT
|
||||
v_arg = '<%s>' % VALUE_ARG
|
||||
SOPT = 'self.opt'
|
||||
|
||||
@@ -226,8 +226,9 @@ for parg in ${opt_values(VALUE_ARG)} {
|
||||
match key {
|
||||
% for p in optional_props:
|
||||
<%
|
||||
ptype = actual_json_type(p.name, p.type)
|
||||
value_unwrap = 'value.unwrap_or("%s")' % JSON_TYPE_VALUE_MAP[ptype]
|
||||
ptype = actual_json_type(p.name, p.get("format", p.type))
|
||||
default_value = JSON_TO_RUST_DEFAULT[ptype]
|
||||
value_unwrap = f"value.unwrap_or({default_value})"
|
||||
%>\
|
||||
"${mangle_subcommand(p.name)}" => {
|
||||
% if p.name == 'alt':
|
||||
@@ -237,7 +238,7 @@ for parg in ${opt_values(VALUE_ARG)} {
|
||||
% endif
|
||||
call = call.${mangle_ident(setter_fn_name(p))}(\
|
||||
% if ptype != 'string':
|
||||
arg_from_str(${value_unwrap}, err, "${mangle_subcommand(p.name)}", "${ptype}")\
|
||||
value.map(|v| arg_from_str(v, err, "${mangle_subcommand(p.name)}", "${ptype}")).unwrap_or(${default_value})\
|
||||
% else:
|
||||
${value_unwrap}\
|
||||
% endif # handle conversion
|
||||
|
||||
@@ -21,7 +21,8 @@ use std::env;
|
||||
use std::io::{self, Write};
|
||||
use clap::{App, SubCommand, Arg};
|
||||
|
||||
use ${to_extern_crate_name(library_to_crate_name(library_name(name, version), make.depends_on_suffix))}::{api, Error, oauth2};
|
||||
use ${to_extern_crate_name(library_to_crate_name(library_name(name, version), make.depends_on_suffix))}::{api, Error, oauth2, client::chrono, FieldMask};
|
||||
|
||||
|
||||
use google_clis_common as client;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user