JMESPath фильтрация даты - PullRequest
       53

JMESPath фильтрация даты

1 голос
/ 17 января 2020

Я пытаюсь преобразовать Ansible скрипт в Python AWS лямбда-функцию. В моем сценарии Python я использую библиотеку jmespath для фильтрации по дате, которая задается в виде строки в формате ISO 8601.

Мой фильтр работает в моем Ansible сценария, а также с помощью инструмента веб-сайта JMESPath . Я не могу понять, почему моя Python версия не работает; Ansible написано Python, поэтому я ожидал, что оно будет работать так же.

Это работает в Ansible:

 - name: parse groups
      debug:
        msg: "{{ results_gitlabGroupsProjects | to_json | from_json  | json_query(projects_query) }}"
      vars:
        projects_query: "json[?last_activity_at > `{{gitlab_date}}`].{name: name, id: id, last_activity_at: last_activity_at }"
      register: gitlabGroupsProjects2

Когда я пытаюсь сделать то же самое в Python, я получаю пустой список, []:

compareTime="2020-01-15T17:55:3S.390Z"
plist2 = jmespath.search('[?last_activity_at > `str(compareTime)`]', project_data )
with open('plist2.json', 'w') as json_file:
    json.dump(plist2, json_file)

Пример JSON данных:

[
  {
    "name": "test",
    "id": 16340975,
    "last_activity_at": "2020-01-15T20:12:49.775Z"
  },
  {
    "name": "test1",
    "id": 11111111,
    "last_activity_at": "2020-01-15T15:57:29.670Z"
  },
  {
    "name": "test2",
    "id": 222222,
    "last_activity_at": "2020-01-15T23:08:22.313Z"
  },
  {
    "name": "test3",
    "id": 133333,
    "last_activity_at": "2020-01-15T22:28:42.628Z"
  },
  {
    "name": "test4",
    "id": 444444,
    "last_activity_at": "2020-01-14T02:20:47.496Z"
  },
  {
    "name": "test5",
    "id": 555555,
    "last_activity_at": "2020-01-13T04:54:18.353Z"
  },
  {
    "name": "test6",
    "id": 66666666,
    "last_activity_at": "2020-01-12T07:12:05.858Z"
  },
  {
    "name": "test7",
    "id": 7777777,
    "last_activity_at": "2020-01-10T20:52:32.269Z"
  }
]

Используя Ansible, и на веб-сайте JMESPath я получаю это вывод:

[
  {
    "name": "test",
    "id": 16340975,
    "last_activity_at": "2020-01-15T20:12:49.775Z"
  },
  {
    "name": "test2",
    "id": 222222,
    "last_activity_at": "2020-01-15T23:08:22.313Z"
  },
  {
    "name": "test3",
    "id": 133333,
    "last_activity_at": "2020-01-15T22:28:42.628Z"
  }
]

1 Ответ

0 голосов
/ 17 января 2020

Вы не можете просто вставить выражение str(compareTime) в виде строкового литерала, и Python поймет, что это то, что вы хотели заменить.

В строке

'[?last_activity_at > `str(compareTime)`]'

ничто не динамично; символы str(compareTime) не имеют специального значения для Python.

В Ansible вы использовали специальный синтаксис {{gitlab_date}}, чтобы сообщить Ansible, что нужно обрабатывать строку иначе значение переменной gitlab_date помещается в строку в этой точке, прежде чем использовать ее как запрос JMESPath.

В Python вам нужно что-то подобное. Например, вы можете использовать форматированный строковый литерал или f-string :

plist2 = jmespath.search(f"[?last_activity_at > `{compareTime}`]", project_data)

f перед строковым литералом говорит Python искать любые выражения между {...} фигурными скобками, поэтому compareTime вставляется на место в этой точке строки. Это очень похоже на синтаксис Ansible.

Выше ожидаемый результат:

>>> jmespath.search(f"[?last_activity_at > `{compareTime}`]", project_data)
[{'name': 'test', 'id': 16340975, 'last_activity_at': '2020-01-15T20:12:49.775Z'}, {'name': 'test2', 'id': 222222, 'last_activity_at': '2020-01-15T23:08:22.313Z'}, {'name': 'test3', 'id': 133333, 'last_activity_at': '2020-01-15T22:28:42.628Z'}]
>>> from pprint import pprint
>>> pprint(_)
[{'id': 16340975,
  'last_activity_at': '2020-01-15T20:12:49.775Z',
  'name': 'test'},
 {'id': 222222,
  'last_activity_at': '2020-01-15T23:08:22.313Z',
  'name': 'test2'},
 {'id': 133333,
  'last_activity_at': '2020-01-15T22:28:42.628Z',
  'name': 'test3'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...