Tutorial
========

GitHub has a JSON API, so let’s play with that. This URL gets us the
last 5 commits from the jq repo.

.. code:: ipython

   >>> import requests # (1)
   >>> data = requests.get('https://api.github.com/repos/jqlang/jq/commits',{'per_page':5}).json()
   >>> data

.. code-annotations::
    1. On some platforms and python versions requires ``pip install requests``.

.. abstract:: Show result
	:collapsible:

	.. code::

		[
			{
				'sha': 'bfb7fd570f521ef832fe1c3bca0e05abd398284c',
				'node_id':
		'C_kwDOAE3WVdoAKGJmYjdmZDU3MGY1MjFlZjgzMmZlMWMzYmNhMGUwNWFiZDM5ODI4NGM',
				'commit': {
					'author': {
						'name': 'David Korczynski',
						'email': 'david@adalogics.com',
						'date': '2023-11-30T13:33:01Z'
					},
					'committer': {
						'name': 'Emanuele Torre',
						'email': 'torreemanuele6@gmail.com',
						'date': '2023-11-30T13:40:36Z'
					},
					'message': 'jq_fuzz_execute: cleanup un-needed
		extern\n\nSigned-off-by: David Korczynski <david@adalogics.com>',
					'tree': {
						'sha': '47b08e6bc3e47c9ab13092d613bda7e4cf35bba0',
						'url':
		'https://api.github.com/repos/jqlang/jq/git/trees/47b08e6bc3e47c9ab13092d613bda
		7e4cf35bba0'
					},
					'url':
		'https://api.github.com/repos/jqlang/jq/git/commits/bfb7fd570f521ef832fe1c3bca0
		e05abd398284c',
					'comment_count': 0,
					'verification': {
						'verified': False,
						'reason': 'unsigned',
						'signature': None,
						'payload': None
					}
				},
				'url':
		'https://api.github.com/repos/jqlang/jq/commits/bfb7fd570f521ef832fe1c3bca0e05a
		bd398284c',
				'html_url':
		'https://github.com/jqlang/jq/commit/bfb7fd570f521ef832fe1c3bca0e05abd398284c',
				'comments_url':
		'https://api.github.com/repos/jqlang/jq/commits/bfb7fd570f521ef832fe1c3bca0e05a
		bd398284c/comments',
				'author': {
					'login': 'DavidKorczynski',
					'id': 657617,
					'node_id': 'MDQ6VXNlcjY1NzYxNw==',
					'avatar_url': 'https://avatars.githubusercontent.com/u/657617?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/DavidKorczynski',
					'html_url': 'https://github.com/DavidKorczynski',
					'followers_url':
		'https://api.github.com/users/DavidKorczynski/followers',
					'following_url':
		'https://api.github.com/users/DavidKorczynski/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/DavidKorczynski/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/DavidKorczynski/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/DavidKorczynski/subscriptions',
					'organizations_url':
		'https://api.github.com/users/DavidKorczynski/orgs',
					'repos_url': 'https://api.github.com/users/DavidKorczynski/repos',
					'events_url':
		'https://api.github.com/users/DavidKorczynski/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/DavidKorczynski/received_events',
					'type': 'User',
					'site_admin': False
				},
				'committer': {
					'login': 'emanuele6',
					'id': 20175435,
					'node_id': 'MDQ6VXNlcjIwMTc1NDM1',
					'avatar_url':
		'https://avatars.githubusercontent.com/u/20175435?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/emanuele6',
					'html_url': 'https://github.com/emanuele6',
					'followers_url':
		'https://api.github.com/users/emanuele6/followers',
					'following_url':
		'https://api.github.com/users/emanuele6/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/emanuele6/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/emanuele6/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/emanuele6/subscriptions',
					'organizations_url': 'https://api.github.com/users/emanuele6/orgs',
					'repos_url': 'https://api.github.com/users/emanuele6/repos',
					'events_url':
		'https://api.github.com/users/emanuele6/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/emanuele6/received_events',
					'type': 'User',
					'site_admin': False
				},
				'parents': [
					{
						'sha': '252ab244cead3670a11d06bc3110f3a4577a2341',
						'url':
		'https://api.github.com/repos/jqlang/jq/commits/252ab244cead3670a11d06bc3110f3a
		4577a2341',
						'html_url':
		'https://github.com/jqlang/jq/commit/252ab244cead3670a11d06bc3110f3a4577a2341'
					}
				]
			},
			{
				'sha': '252ab244cead3670a11d06bc3110f3a4577a2341',
				'node_id':
		'C_kwDOAE3WVdoAKDI1MmFiMjQ0Y2VhZDM2NzBhMTFkMDZiYzMxMTBmM2E0NTc3YTIzNDE',
				'commit': {
					'author': {
						'name': 'David Korczynski',
						'email': 'david@adalogics.com',
						'date': '2023-11-30T13:22:27Z'
					},
					'committer': {
						'name': 'Emanuele Torre',
						'email': 'torreemanuele6@gmail.com',
						'date': '2023-11-30T13:40:36Z'
					},
					'message': 'Add fuzzer targeting jq_next\n\nSigned-off-by: David
		Korczynski <david@adalogics.com>',
					'tree': {
						'sha': '7c6832a4b7376e7793d1239bd0abe0d580c69ee3',
						'url':
		'https://api.github.com/repos/jqlang/jq/git/trees/7c6832a4b7376e7793d1239bd0abe
		0d580c69ee3'
					},
					'url':
		'https://api.github.com/repos/jqlang/jq/git/commits/252ab244cead3670a11d06bc311
		0f3a4577a2341',
					'comment_count': 0,
					'verification': {
						'verified': False,
						'reason': 'unsigned',
						'signature': None,
						'payload': None
					}
				},
				'url':
		'https://api.github.com/repos/jqlang/jq/commits/252ab244cead3670a11d06bc3110f3a
		4577a2341',
				'html_url':
		'https://github.com/jqlang/jq/commit/252ab244cead3670a11d06bc3110f3a4577a2341',
				'comments_url':
		'https://api.github.com/repos/jqlang/jq/commits/252ab244cead3670a11d06bc3110f3a
		4577a2341/comments',
				'author': {
					'login': 'DavidKorczynski',
					'id': 657617,
					'node_id': 'MDQ6VXNlcjY1NzYxNw==',
					'avatar_url': 'https://avatars.githubusercontent.com/u/657617?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/DavidKorczynski',
					'html_url': 'https://github.com/DavidKorczynski',
					'followers_url':
		'https://api.github.com/users/DavidKorczynski/followers',
					'following_url':
		'https://api.github.com/users/DavidKorczynski/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/DavidKorczynski/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/DavidKorczynski/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/DavidKorczynski/subscriptions',
					'organizations_url':
		'https://api.github.com/users/DavidKorczynski/orgs',
					'repos_url': 'https://api.github.com/users/DavidKorczynski/repos',
					'events_url':
		'https://api.github.com/users/DavidKorczynski/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/DavidKorczynski/received_events',
					'type': 'User',
					'site_admin': False
				},
				'committer': {
					'login': 'emanuele6',
					'id': 20175435,
					'node_id': 'MDQ6VXNlcjIwMTc1NDM1',
					'avatar_url':
		'https://avatars.githubusercontent.com/u/20175435?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/emanuele6',
					'html_url': 'https://github.com/emanuele6',
					'followers_url':
		'https://api.github.com/users/emanuele6/followers',
					'following_url':
		'https://api.github.com/users/emanuele6/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/emanuele6/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/emanuele6/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/emanuele6/subscriptions',
					'organizations_url': 'https://api.github.com/users/emanuele6/orgs',
					'repos_url': 'https://api.github.com/users/emanuele6/repos',
					'events_url':
		'https://api.github.com/users/emanuele6/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/emanuele6/received_events',
					'type': 'User',
					'site_admin': False
				},
				'parents': [
					{
						'sha': '13353515bd3aedf84c6e6ebfb726563ae84db778',
						'url':
		'https://api.github.com/repos/jqlang/jq/commits/13353515bd3aedf84c6e6ebfb726563
		ae84db778',
						'html_url':
		'https://github.com/jqlang/jq/commit/13353515bd3aedf84c6e6ebfb726563ae84db778'
					}
				]
			},
			{
				'sha': '13353515bd3aedf84c6e6ebfb726563ae84db778',
				'node_id':
		'C_kwDOAE3WVdoAKDEzMzUzNTE1YmQzYWVkZjg0YzZlNmViZmI3MjY1NjNhZTg0ZGI3Nzg',
				'commit': {
					'author': {
						'name': 'David Korczynski',
						'email': 'david@adalogics.com',
						'date': '2023-11-30T13:22:07Z'
					},
					'committer': {
						'name': 'Emanuele Torre',
						'email': 'torreemanuele6@gmail.com',
						'date': '2023-11-30T13:40:36Z'
					},
					'message': 'jq_fuzz_compile: dump disassembly\n\nSigned-off-by:
		David Korczynski <david@adalogics.com>',
					'tree': {
						'sha': 'a4fe1a9f424352a5f989b629ba666ccacd3ebd61',
						'url':
		'https://api.github.com/repos/jqlang/jq/git/trees/a4fe1a9f424352a5f989b629ba666
		ccacd3ebd61'
					},
					'url':
		'https://api.github.com/repos/jqlang/jq/git/commits/13353515bd3aedf84c6e6ebfb72
		6563ae84db778',
					'comment_count': 0,
					'verification': {
						'verified': False,
						'reason': 'unsigned',
						'signature': None,
						'payload': None
					}
				},
				'url':
		'https://api.github.com/repos/jqlang/jq/commits/13353515bd3aedf84c6e6ebfb726563
		ae84db778',
				'html_url':
		'https://github.com/jqlang/jq/commit/13353515bd3aedf84c6e6ebfb726563ae84db778',
				'comments_url':
		'https://api.github.com/repos/jqlang/jq/commits/13353515bd3aedf84c6e6ebfb726563
		ae84db778/comments',
				'author': {
					'login': 'DavidKorczynski',
					'id': 657617,
					'node_id': 'MDQ6VXNlcjY1NzYxNw==',
					'avatar_url': 'https://avatars.githubusercontent.com/u/657617?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/DavidKorczynski',
					'html_url': 'https://github.com/DavidKorczynski',
					'followers_url':
		'https://api.github.com/users/DavidKorczynski/followers',
					'following_url':
		'https://api.github.com/users/DavidKorczynski/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/DavidKorczynski/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/DavidKorczynski/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/DavidKorczynski/subscriptions',
					'organizations_url':
		'https://api.github.com/users/DavidKorczynski/orgs',
					'repos_url': 'https://api.github.com/users/DavidKorczynski/repos',
					'events_url':
		'https://api.github.com/users/DavidKorczynski/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/DavidKorczynski/received_events',
					'type': 'User',
					'site_admin': False
				},
				'committer': {
					'login': 'emanuele6',
					'id': 20175435,
					'node_id': 'MDQ6VXNlcjIwMTc1NDM1',
					'avatar_url':
		'https://avatars.githubusercontent.com/u/20175435?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/emanuele6',
					'html_url': 'https://github.com/emanuele6',
					'followers_url':
		'https://api.github.com/users/emanuele6/followers',
					'following_url':
		'https://api.github.com/users/emanuele6/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/emanuele6/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/emanuele6/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/emanuele6/subscriptions',
					'organizations_url': 'https://api.github.com/users/emanuele6/orgs',
					'repos_url': 'https://api.github.com/users/emanuele6/repos',
					'events_url':
		'https://api.github.com/users/emanuele6/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/emanuele6/received_events',
					'type': 'User',
					'site_admin': False
				},
				'parents': [
					{
						'sha': '98a206964d59143c6ed9189b91cdb34af1ae5071',
						'url':
		'https://api.github.com/repos/jqlang/jq/commits/98a206964d59143c6ed9189b91cdb34
		af1ae5071',
						'html_url':
		'https://github.com/jqlang/jq/commit/98a206964d59143c6ed9189b91cdb34af1ae5071'
					}
				]
			},
			{
				'sha': '98a206964d59143c6ed9189b91cdb34af1ae5071',
				'node_id':
		'C_kwDOAE3WVdoAKDk4YTIwNjk2NGQ1OTE0M2M2ZWQ5MTg5YjkxY2RiMzRhZjFhZTUwNzE',
				'commit': {
					'author': {
						'name': 'Mattias Wadman',
						'email': 'mattias.wadman@gmail.com',
						'date': '2023-11-29T08:36:33Z'
					},
					'committer': {
						'name': 'GitHub',
						'email': 'noreply@github.com',
						'date': '2023-11-29T08:36:33Z'
					},
					'message': 'Convert decnum to binary64 (double) instead of
		decimal64\n\nThis is what the JSON spec suggests and will also be less
		confusing compared to other jq implementations and langauges.\r\n\r\nRelated to
		#2939',
					'tree': {
						'sha': 'e8055db585b3fa602b289b1fc2e725e293600a17',
						'url':
		'https://api.github.com/repos/jqlang/jq/git/trees/e8055db585b3fa602b289b1fc2e72
		5e293600a17'
					},
					'url':
		'https://api.github.com/repos/jqlang/jq/git/commits/98a206964d59143c6ed9189b91c
		db34af1ae5071',
					'comment_count': 0,
					'verification': {
						'verified': True,
						'reason': 'valid',
						'signature': '-----BEGIN PGP
		SIGNATURE-----\n\nwsBcBAABCAAQBQJlZvgRCRBK7hj4Ov3rIwAAe+MIAB0NJnboF3tHVY+d6VqlY
		Fxe\nA4RP/9ZjFlUrRLCe5jwQU9irhDQuPICjvYa/K0xrIc3oaAnTE4AEM7HxJku9sGdj\ngfRZI1BV
		XKMTpGz0cWX7HpDCJsz9oGIR4myNXyJdsHSgaMeE8/QnedGt2PTGyFoV\nAdH6bj8XyirrPEvJtnhlo
		NS7GMrTfWjVIBRhP5OqIsSN4MgRbxGBHdLTB+g+V/Vq\nRHji3DUdD6HyWrdmwJ3zAlMkyjcfvtgkyY
		OHj9qYWFNXDWtfB1nlhbqW+MVGScOD\nOkZguRVV3xgRa6EFjn32ltzcwB1B5XsoQF+PWfX1pfEseEO
		HVyTFdo/kufADLQM=\n=fC+V\n-----END PGP SIGNATURE-----\n',
						'payload': 'tree
		e8055db585b3fa602b289b1fc2e725e293600a17\nparent
		16170910332b51f1ff497ef566d6a525acdb5b43\nauthor Mattias Wadman
		<mattias.wadman@gmail.com> 1701246993 +0100\ncommitter GitHub
		<noreply@github.com> 1701246993 +0100\n\nConvert decnum to binary64 (double)
		instead of decimal64\n\nThis is what the JSON spec suggests and will also be
		less confusing compared to other jq implementations and
		langauges.\r\n\r\nRelated to #2939'
					}
				},
				'url':
		'https://api.github.com/repos/jqlang/jq/commits/98a206964d59143c6ed9189b91cdb34
		af1ae5071',
				'html_url':
		'https://github.com/jqlang/jq/commit/98a206964d59143c6ed9189b91cdb34af1ae5071',
				'comments_url':
		'https://api.github.com/repos/jqlang/jq/commits/98a206964d59143c6ed9189b91cdb34
		af1ae5071/comments',
				'author': {
					'login': 'wader',
					'id': 185566,
					'node_id': 'MDQ6VXNlcjE4NTU2Ng==',
					'avatar_url': 'https://avatars.githubusercontent.com/u/185566?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/wader',
					'html_url': 'https://github.com/wader',
					'followers_url': 'https://api.github.com/users/wader/followers',
					'following_url':
		'https://api.github.com/users/wader/following{/other_user}',
					'gists_url': 'https://api.github.com/users/wader/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/wader/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/wader/subscriptions',
					'organizations_url': 'https://api.github.com/users/wader/orgs',
					'repos_url': 'https://api.github.com/users/wader/repos',
					'events_url':
		'https://api.github.com/users/wader/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/wader/received_events',
					'type': 'User',
					'site_admin': False
				},
				'committer': {
					'login': 'web-flow',
					'id': 19864447,
					'node_id': 'MDQ6VXNlcjE5ODY0NDQ3',
					'avatar_url':
		'https://avatars.githubusercontent.com/u/19864447?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/web-flow',
					'html_url': 'https://github.com/web-flow',
					'followers_url': 'https://api.github.com/users/web-flow/followers',
					'following_url':
		'https://api.github.com/users/web-flow/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/web-flow/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/web-flow/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/web-flow/subscriptions',
					'organizations_url': 'https://api.github.com/users/web-flow/orgs',
					'repos_url': 'https://api.github.com/users/web-flow/repos',
					'events_url':
		'https://api.github.com/users/web-flow/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/web-flow/received_events',
					'type': 'User',
					'site_admin': False
				},
				'parents': [
					{
						'sha': '16170910332b51f1ff497ef566d6a525acdb5b43',
						'url':
		'https://api.github.com/repos/jqlang/jq/commits/16170910332b51f1ff497ef566d6a52
		5acdb5b43',
						'html_url':
		'https://github.com/jqlang/jq/commit/16170910332b51f1ff497ef566d6a525acdb5b43'
					}
				]
			},
			{
				'sha': '16170910332b51f1ff497ef566d6a525acdb5b43',
				'node_id':
		'C_kwDOAE3WVdoAKDE2MTcwOTEwMzMyYjUxZjFmZjQ5N2VmNTY2ZDZhNTI1YWNkYjViNDM',
				'commit': {
					'author': {
						'name': 'Emanuele Torre',
						'email': 'torreemanuele6@gmail.com',
						'date': '2023-11-29T05:12:25Z'
					},
					'committer': {
						'name': 'Emanuele Torre',
						'email': 'torreemanuele6@gmail.com',
						'date': '2023-11-29T08:35:36Z'
					},
					'message': 'website: use https URLs instead of http URLs in
		download page\n\nAlso add markdown formatting for decNumber URL so it gets
		rendered as a\nlink in the html page.',
					'tree': {
						'sha': 'ff8b801f14994e4a177ee22b3c9b649281ec8af6',
						'url':
		'https://api.github.com/repos/jqlang/jq/git/trees/ff8b801f14994e4a177ee22b3c9b6
		49281ec8af6'
					},
					'url':
		'https://api.github.com/repos/jqlang/jq/git/commits/16170910332b51f1ff497ef566d
		6a525acdb5b43',
					'comment_count': 0,
					'verification': {
						'verified': False,
						'reason': 'unsigned',
						'signature': None,
						'payload': None
					}
				},
				'url':
		'https://api.github.com/repos/jqlang/jq/commits/16170910332b51f1ff497ef566d6a52
		5acdb5b43',
				'html_url':
		'https://github.com/jqlang/jq/commit/16170910332b51f1ff497ef566d6a525acdb5b43',
				'comments_url':
		'https://api.github.com/repos/jqlang/jq/commits/16170910332b51f1ff497ef566d6a52
		5acdb5b43/comments',
				'author': {
					'login': 'emanuele6',
					'id': 20175435,
					'node_id': 'MDQ6VXNlcjIwMTc1NDM1',
					'avatar_url':
		'https://avatars.githubusercontent.com/u/20175435?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/emanuele6',
					'html_url': 'https://github.com/emanuele6',
					'followers_url':
		'https://api.github.com/users/emanuele6/followers',
					'following_url':
		'https://api.github.com/users/emanuele6/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/emanuele6/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/emanuele6/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/emanuele6/subscriptions',
					'organizations_url': 'https://api.github.com/users/emanuele6/orgs',
					'repos_url': 'https://api.github.com/users/emanuele6/repos',
					'events_url':
		'https://api.github.com/users/emanuele6/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/emanuele6/received_events',
					'type': 'User',
					'site_admin': False
				},
				'committer': {
					'login': 'emanuele6',
					'id': 20175435,
					'node_id': 'MDQ6VXNlcjIwMTc1NDM1',
					'avatar_url':
		'https://avatars.githubusercontent.com/u/20175435?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/emanuele6',
					'html_url': 'https://github.com/emanuele6',
					'followers_url':
		'https://api.github.com/users/emanuele6/followers',
					'following_url':
		'https://api.github.com/users/emanuele6/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/emanuele6/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/emanuele6/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/emanuele6/subscriptions',
					'organizations_url': 'https://api.github.com/users/emanuele6/orgs',
					'repos_url': 'https://api.github.com/users/emanuele6/repos',
					'events_url':
		'https://api.github.com/users/emanuele6/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/emanuele6/received_events',
					'type': 'User',
					'site_admin': False
				},
				'parents': [
					{
						'sha': 'd14393f5522531f57b8e3a83c04b7990c64a249e',
						'url':
		'https://api.github.com/repos/jqlang/jq/commits/d14393f5522531f57b8e3a83c04b799
		0c64a249e',
						'html_url':
		'https://github.com/jqlang/jq/commit/d14393f5522531f57b8e3a83c04b7990c64a249e'
					}
				]
			}
		]


We can use jq to extract just the first commit.

.. code:: ipython

   >>> from jqpy import jq
   >>> jq(r'.[0]', data)

.. abstract:: Show result
	:collapsible:

	.. code::

		[
			{
				'sha': 'bfb7fd570f521ef832fe1c3bca0e05abd398284c',
				'node_id':
		'C_kwDOAE3WVdoAKGJmYjdmZDU3MGY1MjFlZjgzMmZlMWMzYmNhMGUwNWFiZDM5ODI4NGM',
				'commit': {
					'author': {
						'name': 'David Korczynski',
						'email': 'david@adalogics.com',
						'date': '2023-11-30T13:33:01Z'
					},
					'committer': {
						'name': 'Emanuele Torre',
						'email': 'torreemanuele6@gmail.com',
						'date': '2023-11-30T13:40:36Z'
					},
					'message': 'jq_fuzz_execute: cleanup un-needed
		extern\n\nSigned-off-by: David Korczynski <david@adalogics.com>',
					'tree': {
						'sha': '47b08e6bc3e47c9ab13092d613bda7e4cf35bba0',
						'url':
		'https://api.github.com/repos/jqlang/jq/git/trees/47b08e6bc3e47c9ab13092d613bda
		7e4cf35bba0'
					},
					'url':
		'https://api.github.com/repos/jqlang/jq/git/commits/bfb7fd570f521ef832fe1c3bca0
		e05abd398284c',
					'comment_count': 0,
					'verification': {
						'verified': False,
						'reason': 'unsigned',
						'signature': None,
						'payload': None
					}
				},
				'url':
		'https://api.github.com/repos/jqlang/jq/commits/bfb7fd570f521ef832fe1c3bca0e05a
		bd398284c',
				'html_url':
		'https://github.com/jqlang/jq/commit/bfb7fd570f521ef832fe1c3bca0e05abd398284c',
				'comments_url':
		'https://api.github.com/repos/jqlang/jq/commits/bfb7fd570f521ef832fe1c3bca0e05a
		bd398284c/comments',
				'author': {
					'login': 'DavidKorczynski',
					'id': 657617,
					'node_id': 'MDQ6VXNlcjY1NzYxNw==',
					'avatar_url': 'https://avatars.githubusercontent.com/u/657617?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/DavidKorczynski',
					'html_url': 'https://github.com/DavidKorczynski',
					'followers_url':
		'https://api.github.com/users/DavidKorczynski/followers',
					'following_url':
		'https://api.github.com/users/DavidKorczynski/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/DavidKorczynski/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/DavidKorczynski/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/DavidKorczynski/subscriptions',
					'organizations_url':
		'https://api.github.com/users/DavidKorczynski/orgs',
					'repos_url': 'https://api.github.com/users/DavidKorczynski/repos',
					'events_url':
		'https://api.github.com/users/DavidKorczynski/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/DavidKorczynski/received_events',
					'type': 'User',
					'site_admin': False
				},
				'committer': {
					'login': 'emanuele6',
					'id': 20175435,
					'node_id': 'MDQ6VXNlcjIwMTc1NDM1',
					'avatar_url':
		'https://avatars.githubusercontent.com/u/20175435?v=4',
					'gravatar_id': '',
					'url': 'https://api.github.com/users/emanuele6',
					'html_url': 'https://github.com/emanuele6',
					'followers_url':
		'https://api.github.com/users/emanuele6/followers',
					'following_url':
		'https://api.github.com/users/emanuele6/following{/other_user}',
					'gists_url':
		'https://api.github.com/users/emanuele6/gists{/gist_id}',
					'starred_url':
		'https://api.github.com/users/emanuele6/starred{/owner}{/repo}',
					'subscriptions_url':
		'https://api.github.com/users/emanuele6/subscriptions',
					'organizations_url': 'https://api.github.com/users/emanuele6/orgs',
					'repos_url': 'https://api.github.com/users/emanuele6/repos',
					'events_url':
		'https://api.github.com/users/emanuele6/events{/privacy}',
					'received_events_url':
		'https://api.github.com/users/emanuele6/received_events',
					'type': 'User',
					'site_admin': False
				},
				'parents': [
					{
						'sha': '252ab244cead3670a11d06bc3110f3a4577a2341',
						'url':
		'https://api.github.com/repos/jqlang/jq/commits/252ab244cead3670a11d06bc3110f3a
		4577a2341',
						'html_url':
		'https://github.com/jqlang/jq/commit/252ab244cead3670a11d06bc3110f3a4577a2341'
					}
				]
			}
		]


Here we invoke :py:func:`jqpy.jq` function to process JSON compatible ``data`` with
``r'.[0]'`` filtration expression. Function :py:func:`jqpy.jq` always returns list
of JSON compatible results. In the most cases there will be only one
result.

.. info::

	Raw-string literal (prefixed with *r* symbol) is not necessary here but be careful about mixing pythonic escape sequences with jq formatting expression.

There’s a lot of info we don’t care about there, so we’ll restrict it
down to the most interesting fields.

.. code:: ipython

   >>> jq(r'.[0] | {message: .commit.message, name: .commit.committer.name}', data)

.. abstract:: Show result
	:collapsible:

	.. code::

		[
			{
				'message': 'jq_fuzz_execute: cleanup un-needed extern\n\nSigned-off-by:
		David Korczynski <david@adalogics.com>',
				'name': 'Emanuele Torre'
			}
		]


The ``|`` operator in jq feeds the output of one filter (``.[0]`` which
gets the first element of the array in the response) into the input of
another (``{...}`` which builds an object out of those fields). You can
access nested attributes, such as ``.commit.message``.

Now let’s get the rest of the commits.

.. code:: ipython

   >>> jq(r'.[] | {message: .commit.message, name: .commit.committer.name}', data)

.. abstract:: Show result
	:collapsible:

	.. code::

		[
			{
				'message': 'jq_fuzz_execute: cleanup un-needed extern\n\nSigned-off-by:
		David Korczynski <david@adalogics.com>',
				'name': 'Emanuele Torre'
			},
			{
				'message': 'Add fuzzer targeting jq_next\n\nSigned-off-by: David
		Korczynski <david@adalogics.com>',
				'name': 'Emanuele Torre'
			},
			{
				'message': 'jq_fuzz_compile: dump disassembly\n\nSigned-off-by: David
		Korczynski <david@adalogics.com>',
				'name': 'Emanuele Torre'
			},
			{
				'message': 'Convert decnum to binary64 (double) instead of
		decimal64\n\nThis is what the JSON spec suggests and will also be less
		confusing compared to other jq implementations and langauges.\r\n\r\nRelated to
		#2939',
				'name': 'GitHub'
			},
			{
				'message': 'website: use https URLs instead of http URLs in download
		page\n\nAlso add markdown formatting for decNumber URL so it gets rendered as
		a\nlink in the html page.',
				'name': 'Emanuele Torre'
			}
		]


``.[]`` returns each element of the array returned in the response, one
at a time, which are all fed into
``{message: .commit.message, name: .commit.committer.name}``.

If you want to get the output as a single array, you can tell jq to
“collect” all the answers by wrapping the filter in square brackets:

.. code:: ipython

   >>> jq(r'[.[] | {message: .commit.message, name: .commit.committer.name}]', data)

.. abstract:: Show result
	:collapsible:

	.. code::

		[
			[
				{
					'message': 'jq_fuzz_execute: cleanup un-needed
		extern\n\nSigned-off-by: David Korczynski <david@adalogics.com>',
					'name': 'Emanuele Torre'
				},
				{
					'message': 'Add fuzzer targeting jq_next\n\nSigned-off-by: David
		Korczynski <david@adalogics.com>',
					'name': 'Emanuele Torre'
				},
				{
					'message': 'jq_fuzz_compile: dump disassembly\n\nSigned-off-by:
		David Korczynski <david@adalogics.com>',
					'name': 'Emanuele Torre'
				},
				{
					'message': 'Convert decnum to binary64 (double) instead of
		decimal64\n\nThis is what the JSON spec suggests and will also be less
		confusing compared to other jq implementations and langauges.\r\n\r\nRelated to
		#2939',
					'name': 'GitHub'
				},
				{
					'message': 'website: use https URLs instead of http URLs in
		download page\n\nAlso add markdown formatting for decNumber URL so it gets
		rendered as a\nlink in the html page.',
					'name': 'Emanuele Torre'
				}
			]
		]

Next, let’s try getting the URLs of the parent commits out of the API
results as well. In each commit, the GitHub API includes information
about “parent” commits. There can be one or many.

.. code::

   "parents": [
     {
       "sha": "f2ad9517c72f6267ae317639ab56bbfd4a8653d4",
       "url": "https://api.github.com/repos/jqlang/jq/commits/f2ad9517c72f6267ae317639ab56bbfd4a8653d4",
       "html_url": "https://github.com/jqlang/jq/commit/f2ad9517c72f6267ae317639ab56bbfd4a8653d4"
     }
   ]

We want to pull out all the “html_url” fields inside that array of
parent commits and make a simple list of strings to go along with the
“message” and “author” fields we already have.

.. code:: ipython

   >>> jq(r'[.[] | {message: .commit.message, name: .commit.committer.name, parents: [.parents[].html_url]}]', data)

.. abstract:: Show result
	:collapsible:

	.. code::

		[
			[
				{
					'message': 'jq_fuzz_execute: cleanup un-needed
		extern\n\nSigned-off-by: David Korczynski <david@adalogics.com>',
					'name': 'Emanuele Torre',
					'parents': [
						'https://github.com/jqlang/jq/commit/252ab244cead3670a11d06bc31
		10f3a4577a2341'
					]
				},
				{
					'message': 'Add fuzzer targeting jq_next\n\nSigned-off-by: David
		Korczynski <david@adalogics.com>',
					'name': 'Emanuele Torre',
					'parents': [
						'https://github.com/jqlang/jq/commit/13353515bd3aedf84c6e6ebfb7
		26563ae84db778'
					]
				},
				{
					'message': 'jq_fuzz_compile: dump disassembly\n\nSigned-off-by:
		David Korczynski <david@adalogics.com>',
					'name': 'Emanuele Torre',
					'parents': [
						'https://github.com/jqlang/jq/commit/98a206964d59143c6ed9189b91
		cdb34af1ae5071'
					]
				},
				{
					'message': 'Convert decnum to binary64 (double) instead of
		decimal64\n\nThis is what the JSON spec suggests and will also be less
		confusing compared to other jq implementations and langauges.\r\n\r\nRelated to
		#2939',
					'name': 'GitHub',
					'parents': [
						'https://github.com/jqlang/jq/commit/16170910332b51f1ff497ef566
		d6a525acdb5b43'
					]
				},
				{
					'message': 'website: use https URLs instead of http URLs in
		download page\n\nAlso add markdown formatting for decNumber URL so it gets
		rendered as a\nlink in the html page.',
					'name': 'Emanuele Torre',
					'parents': [
						'https://github.com/jqlang/jq/commit/d14393f5522531f57b8e3a83c0
		4b7990c64a249e'
					]
				}
			]
		]

Here we’re making an object as before, but this time the parents field
is being set to ``[.parents[].html_url]``, which collects all the parent
commit URLs defined in the parents object.

.. info::

	Visit original tutorial `website <https://jqlang.github.io/jq/manual/>`_ to see more examples and read about JQ filtration language.
