2 # - BASH command-not-found functionality disabled for now as it needs patched bash
3 # (details in bash from Fedora Rawhide)
6 %bcond_without doc # build without docs
7 %bcond_without introspection # gobject introspection, time to time broken
8 %bcond_without static_libs # static library
9 %bcond_without python # Python binding (used by entropy and portage backends)
10 %bcond_without vala # Vala binding
12 %bcond_with alpm # ALPM (Arch Linux package manager) backend
13 %bcond_with apt # APT (Debian/Ubuntu) backend using C++ API
14 %bcond_with dnf # DNF (Fedora/RHEL) backend
15 %bcond_with entropy # Entropy (Sabayon) backend (Python)
16 %bcond_with nix # Nix (NixOS) backend [broken as of 1.2.0]
17 %bcond_without poldek # Poldek (PLD) backend
18 %bcond_with portage # portage (Gentoo) backend (Python)
19 %bcond_with slack # Slack (Slackware) backend
20 %bcond_with zypp # ZYPP (openSUSE/SLE) backend [broken as of 1.2.0]
23 %undefine with_entropy
24 %undefine with_portage
27 Summary: System daemon that is a D-Bus abstraction layer for package management
28 Summary(pl.UTF-8): Demon systemowy będący warstwą abstrakcji D-Bus do zarządzania pakietami
33 Group: Applications/System
34 Source0: https://www.freedesktop.org/software/PackageKit/releases/%{name}-%{version}.tar.xz
35 # Source0-md5: a37ba4a460ab15ac4374bfc0e792d377
36 Patch0: %{name}-poldek.patch
37 Patch1: %{name}-bashcomp.patch
38 Patch2: %{name}-meson.patch
39 Patch3: consolekit-fallback.patch
40 URL: https://www.freedesktop.org/software/PackageKit/
41 %{?with_apt:BuildRequires: AppStream-devel >= 0.11}
42 BuildRequires: NetworkManager-devel >= 0.6.5
43 # pkgconfig(libalpm) >= 12.0.0
44 %{?with_alpm:BuildRequires: alpm-devel >= 5.2}
45 %{?with_dnf:BuildRequires: appstream-glib-devel}
46 %{?with_apt:BuildRequires: apt-devel >= 1.7}
47 BuildRequires: connman-devel
48 %{?with_slack:BuildRequires: curl-devel}
49 BuildRequires: dbus-devel >= 1.2.0
50 BuildRequires: dbus-glib-devel >= 0.76
51 BuildRequires: docbook-dtd412-xml
52 BuildRequires: docbook-dtd42-xml
53 BuildRequires: fontconfig-devel
54 BuildRequires: gettext-tools
55 BuildRequires: glib2-devel >= 1:2.54.0
56 %{?with_introspection:BuildRequires: gobject-introspection-devel >= 0.9.9}
57 BuildRequires: gstreamer-devel >= 1.0.0
58 BuildRequires: gstreamer-plugins-base-devel >= 1.0.0
59 BuildRequires: gtk+3-devel >= 3.0.0
60 %{?with_doc:BuildRequires: gtk-doc >= 1.11}
61 BuildRequires: libarchive-devel
62 %{?with_dnf:BuildRequires: libdnf-devel >= 0.43.1}
63 %if %{with apt} || %{with nix}
64 BuildRequires: libstdc++-devel >= 6:4.7
66 %{?with_slack:BuildRequires: libstdc++-devel >= 6:5}
67 BuildRequires: libxslt-progs
68 %{?with_zypp:BuildRequires: libzypp-devel >= 15}
69 BuildRequires: meson >= 0.47.0
70 BuildRequires: ninja >= 1.5
71 # nix-expr nix-main nix-store
72 %{?with_nix:BuildRequires: nix-devel >= 1.12}
73 BuildRequires: pango-devel
74 BuildRequires: pkgconfig
75 # when released; just to detect which reboot modes to use (library not linked)
76 #BuildRequires: plymouth-devel >= 0.9.5
77 %{?with_poldek:BuildRequires: poldek-devel >= 0.30-1.rc6.4}
78 BuildRequires: polkit-devel >= 0.114
80 %{?with_python:BuildRequires: python-devel >= 1:2.7}
81 BuildRequires: readline-devel
82 %{?with_dnf:BuildRequires: rpm-devel >= 4.?}
83 BuildRequires: rpm-pythonprov
84 BuildRequires: rpmbuild(macros) >= 1.736
85 BuildRequires: sed >= 4.0
86 BuildRequires: sqlite3-devel >= 3
87 BuildRequires: systemd-devel >= 1:213
88 BuildRequires: tar >= 1:1.22
89 BuildRequires: udev-glib-devel
90 %{?with_vala:BuildRequires: vala >= 2:0.16}
92 Requires(post,postun): shared-mime-info
93 Requires: %{name}-backend
94 Requires: %{name}-libs = %{version}-%{release}
96 Requires: polkit >= 0.114
97 Suggests: ConsoleKit-x11
98 Obsoletes: PackageKit-backend-pisi
99 Obsoletes: PackageKit-backend-ports
100 Obsoletes: PackageKit-backend-smart
101 Obsoletes: PackageKit-backend-urpmi
102 Obsoletes: PackageKit-backend-yum
103 Obsoletes: PackageKit-docs < 0.8.4
104 Obsoletes: pm-utils-packagekit
105 BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
108 PackageKit is a D-Bus abstraction layer that allows the session user
109 to manage packages in a secure way using a cross-distro,
110 cross-architecture API.
112 %description -l pl.UTF-8
113 PackageKit to warstwa abstrakcji D-Bus pozwalająca użytkownikowi
114 sesyjnemu w bezpieczny sposob zarządzać pakietami przy użyciu API
115 zgodnego z wieloma dystrybucjami i architekturami.
118 Summary: packagekit-glib library
119 Summary(pl.UTF-8): Biblioteka packagekit-glib
121 Requires: glib2 >= 1:2.54.0
122 Obsoletes: browser-plugin-packagekit < 1.1.0
125 packagekit-glib library.
127 %description libs -l pl.UTF-8
128 Biblioteka packagekit-glib.
131 Summary: Header files for packagekit-glib library
132 Summary(pl.UTF-8): Pliki nagłówkowe biblioteki packagekit-glib
133 Group: Development/Libraries
134 Requires: %{name}-libs = %{version}-%{release}
135 Requires: dbus-devel >= 1.2.0
136 Requires: glib2-devel >= 1:2.54.0
137 Requires: sqlite3-devel
140 Header files for packagekit-glib library.
142 %description devel -l pl.UTF-8
143 Pliki nagłówkowe biblioteki packagekit-glib.
146 Summary: Static packagekit-glib library
147 Summary(pl.UTF-8): Statyczna biblioteka packagekit-glib
148 Group: Development/Libraries
149 Requires: %{name}-devel = %{version}-%{release}
152 Static packagekit-glib library.
154 %description static -l pl.UTF-8
155 Statyczna biblioteka packagekit-glib.
157 %package -n vala-packagekit
158 Summary: Vala API for PackageKit library
159 Summary(pl.UTF-8): API języka Vala do biblioteki PackageKitu
160 Group: Development/Libraries
161 Requires: %{name}-devel = %{version}-%{release}
162 Requires: vala >= 2:0.16
163 %if "%{_rpmversion}" >= "4.6"
167 %description -n vala-packagekit
168 Vala API for PackageKit library.
170 %description -n vala-packagekit -l pl.UTF-8
171 API języka Vala do biblioteki PackageKitu.
174 Summary: PackageKit library API documentation
175 Summary(pl.UTF-8): Dokumentacja API biblioteki PackageKit
177 Requires: gtk-doc-common
178 %if "%{_rpmversion}" >= "4.6"
183 PackageKit library API documentation.
185 %description apidocs -l pl.UTF-8
186 Dokumentacja API biblioteki PackageKit.
188 %package backend-alpm
189 Summary: PackageKit ALPM backend
190 Summary(pl.UTF-8): Backend PackageKit oparty na bibliotece ALPM
192 Requires: %{name} = %{version}-%{release}
193 Provides: %{name}-backend = %{version}-%{release}
195 %description backend-alpm
196 A backend for PackageKit to enable Arch Linux packages via ALPM
199 %description backend-alpm -l pl.UTF-8
200 Backend PackageKit dodający obsługę pakietów Arch Linuksa poprzez
203 %package backend-aptcc
204 Summary: PackageKit APTcc backend
205 Summary(pl.UTF-8): Backend PackageKit APTcc
207 Requires: %{name} = %{version}-%{release}
208 Requires: AppStream >= 0.11
209 Provides: %{name}-backend = %{version}-%{release}
211 %description backend-aptcc
212 A backend for PackageKit to enable APT support via C++ API.
214 %description backend-aptcc -l pl.UTF-8
215 Backend PackageKit dodający obsługę zarządcy pakietów APT poprzez API
219 Summary: PackageKit dnf backend
220 Summary(pl.UTF-8): Backend PackageKit oparty na bibliotece dnfhif
222 Requires: %{name} = %{version}-%{release}
223 Provides: %{name}-backend = %{version}-%{release}
224 Obsoletes: PackageKit-backend-hawkey
225 Obsoletes: PackageKit-backend-hif
227 %description backend-dnf
228 A backend for PackageKit to enable RPM packages support via dnf
229 library (used in Fedora).
231 %description backend-dnf -l pl.UTF-8
232 Backend PackageKit dodający obsługę pakietów RPM poprzez bibliotekę
233 dnf (używaną w dystrybucji Fedora).
235 %package backend-entropy
236 Summary: PackageKit Entropy backend
237 Summary(pl.UTF-8): Backend PackageKit Entropy
239 Requires: %{name} = %{version}-%{release}
240 Requires: python-packagekit = %{version}-%{release}
241 #Requires: python-entropy
242 Provides: %{name}-backend = %{version}-%{release}
244 %description backend-entropy
245 A backend for PackageKit to enable Sabayon packages support through
246 Entropy package manager.
248 %description backend-entropy -l pl.UTF-8
249 Backend PackageKit dodający obsługę pakietów dystrybucji Sabayon przy
250 użyciu zarządcy pakietów Entropy.
253 Summary: PackageKit Nix backend
254 Summary(pl.UTF-8): Backend PackageKit oparty na zarządcy pakietów Nix
256 Requires: %{name} = %{version}-%{release}
257 Requires: nix >= 1.12
258 Provides: %{name}-backend = %{version}-%{release}
260 %description backend-nix
261 A backend for PackageKit to enable Nix packages support (used in
264 %description backend-nix -l pl.UTF-8
265 Backend PackageKit dodający obsługę pakietów Nix (używanych w NixOS).
267 %package backend-poldek
268 Summary: PackageKit Poldek backend
269 Summary(pl.UTF-8): Backend PackageKit oparty na Poldku
271 Requires: %{name} = %{version}-%{release}
272 Requires: poldek >= 0.30-1.rc6.4
273 Provides: %{name}-backend = %{version}-%{release}
275 %description backend-poldek
276 A backend for PackageKit to enable RPM packages support through Poldek
277 - native PLD package manager.
279 %description backend-poldek -l pl.UTF-8
280 Backend PackageKit dodający obsługę pakietów RPM poprzez Poldka -
281 natywnego zarządcę pakietów dystrybucji PLD.
283 %package backend-portage
284 Summary: PackageKit Portage backend
285 Summary(pl.UTF-8): Backend PackageKit Portage
287 Requires: %{name} = %{version}-%{release}
288 Requires: python-packagekit = %{version}-%{release}
289 #Requires: python-portage
290 Provides: %{name}-backend = %{version}-%{release}
292 %description backend-portage
293 A backend for PackageKit to enable Gentoo Portage support.
295 %description backend-portage -l pl.UTF-8
296 Backend PackageKit dodający obsługę systemu Portage dystrybucji
299 %package backend-slack
300 Summary: PackageKit Slack backend
301 Summary(pl.UTF-8): Backend PackageKit Slack
303 Requires: %{name} = %{version}-%{release}
304 Provides: %{name}-backend = %{version}-%{release}
305 Obsoletes: PackageKit-backend-katja
307 %description backend-slack
308 Slack backend for PackageKit to enable Slackware repositories support.
310 %description backend-slack -l pl.UTF-8
311 Backend PackageKit Slack dodający obsługę repozytoriów Slackware.
313 %package backend-zypp
314 Summary: PackageKit Zypp backend
315 Summary(pl.UTF-8): Backend PackageKit Zypp
317 Requires: %{name} = %{version}-%{release}
318 Requires: libzypp >= 15
319 Provides: %{name}-backend = %{version}-%{release}
321 %description backend-zypp
322 A backend for PackageKit to enable RPM packages support through Zypp
323 library (originated in openSUSE/SLE).
325 %description backend-zypp -l pl.UTF-8
326 Backend PackageKit dodający obsługę pakietów RPM poprzez bibliotekę
327 Zypp (pochodzącą z dystrybucji openSUSE/SLE).
329 %package gstreamer-plugin
330 Summary: GStreamer codecs installer
331 Summary(pl.UTF-8): Instalator kodeków GStreamera
333 Requires: %{name} = %{version}-%{release}
334 Requires: %{name}-gtk3-module = %{version}-%{release}
336 %description gstreamer-plugin
337 The PackageKit GStreamer plugin allows any GStreamer application to
338 install codecs from configured repositories using PackageKit.
340 %description gstreamer-plugin -l pl.UTF-8
341 Wtyczka GStreamer pozwala każdej aplikacji używającej GStreamera
342 zainstalować kodeki ze skonfigurowanych źródeł PackageKit.
345 Summary: GTK+ 3.x module to detect and install missing fonts
346 Summary(pl.UTF-8): Moduł GTK+ 3.x do wykrywania i instalowania brakujących czcionek
348 Obsoletes: PackageKit-gtk-module < 1.2.0
350 %description gtk3-module
351 The PackageKit GTK+ 3.x module allows any pango application to install
352 missing fonts from configured repositories using PackageKit.
354 %description gtk3-module -l pl.UTF-8
355 Moduł GTK+ 3.x pozwala każdej aplikacji używającej pango zainstalować
356 brakującą czcionkę ze skonfigurowanych źródeł PackageKit.
358 %package -n bash-completion-packagekit
359 Summary: Bash completion for PackageKit console commands
360 Summary(pl.UTF-8): Bashowe uzupełnianie parametrów dla poleceń konsolowych PackageKit
361 Group: Applications/Shells
362 Requires: %{name} = %{version}-%{release}
363 Requires: bash-completion >= 2
364 %if "%{_rpmversion}" >= "4.6"
368 %description -n bash-completion-packagekit
369 This package provides bash-completion for PackageKit console commands.
371 %description -n bash-completion-packagekit -l pl.UTF-8
372 Pakiet ten dostarcza bashowe uzupełnianie parametrów dla poleceń
373 konsolowych PackageKit.
375 %package -n python-packagekit
376 Summary: PackageKit Python bindings
377 Summary(pl.UTF-8): Wiązania PackageKit dla Pythona
378 Group: Development/Languages/Python
379 Requires: python-dbus
380 Requires: python-pygobject
382 %description -n python-packagekit
383 PackageKit Python bindings.
385 %description -n python-packagekit -l pl.UTF-8
386 Wiązania PackageKit dla Pythona.
395 %if %{with static_libs}
396 %{__sed} -i -e '/^packagekit_glib2_library =/ s/shared_library/library/' lib/packagekit-glib2/meson.build
400 %{?with_zypp:CPPFLAGS="%{rpmcppflags} -D_RPM_5 -I/usr/include/rpm"}
402 -Dbash_command_not_found=false \
403 -Dbash_completion_dir=%{bash_compdir} \
404 %{!?with_introspection:-Dgobject_introspection=false} \
405 %{?with_doc:-Dgtk_doc=true} \
406 -Dpackaging_backend=dummy%{?with_alpm:,alpm}%{?with_apt:,aptcc}%{?with_dnf:,dnf}%{?with_entropy:,entropy}%{?with_poldek:,poldek}%{?with_portage:,portage}%{?with_slack:,slack}%{?with_zypp:,zypp}%{?with_nix:,nix} \
407 %{!?with_python:-Dpython_backend=false} \
408 -Dpythonpackagedir=%{py_sitescriptdir} \
409 -Dsystemdsystemunitdir=%{systemdunitdir}
415 %ninja_build -C build
418 rm -rf $RPM_BUILD_ROOT
419 install -d $RPM_BUILD_ROOT/var/cache/PackageKit/downloads
421 %ninja_install -C build
423 %{__rm} $RPM_BUILD_ROOT%{_libdir}/packagekit-backend/libpk_backend_test_*.so
425 %if %{without apt} && %{without entropy} && %{without portage}
426 # common dir not created if no users built with PackageKit
427 install -d $RPM_BUILD_ROOT%{_datadir}/PackageKit/helpers
430 # use pk-gstreamer-install as codec installer
431 ln -s pk-gstreamer-install $RPM_BUILD_ROOT%{_libexecdir}/gst-install-plugins-helper
433 install -d $RPM_BUILD_ROOT%{systemdunitdir}/system-update.target.wants
434 ln -sf ../packagekit-offline-update.service \
435 $RPM_BUILD_ROOT%{systemdunitdir}/system-update.target.wants/packagekit-offline-update.service
438 %py_comp $RPM_BUILD_ROOT%{py_sitescriptdir}
439 %py_ocomp $RPM_BUILD_ROOT%{py_sitescriptdir}
447 rm -rf $RPM_BUILD_ROOT
450 %update_mime_database
453 %update_mime_database
455 %post libs -p /sbin/ldconfig
456 %postun libs -p /sbin/ldconfig
458 %files -f %{name}.lang
459 %defattr(644,root,root,755)
460 %doc AUTHORS HACKING MAINTAINERS NEWS README
461 %attr(755,root,root) %{_bindir}/pkcon
462 %attr(755,root,root) %{_bindir}/pkmon
463 %attr(750,root,root) /etc/cron.daily/packagekit-background.cron
464 %attr(755,root,root) %{_libexecdir}/packagekit-direct
465 %attr(755,root,root) %{_libexecdir}/packagekitd
466 %attr(755,root,root) %{_libexecdir}/pk-offline-update
467 %dir %{_libdir}/packagekit-backend
468 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_dummy.so
469 %dir %{_sysconfdir}/PackageKit
470 %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/PackageKit/PackageKit.conf
471 %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/PackageKit/Vendor.conf
472 %attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/sysconfig/packagekit-background
473 /etc/dbus-1/system.d/org.freedesktop.PackageKit.conf
474 %dir %{_datadir}/PackageKit
475 %dir %{_datadir}/PackageKit/helpers
476 %attr(755,root,root) %{_datadir}/PackageKit/pk-upgrade-distro.sh
477 %{_datadir}/polkit-1/actions/org.freedesktop.packagekit.policy
478 %{_datadir}/polkit-1/rules.d/org.freedesktop.packagekit.rules
479 %{_datadir}/dbus-1/system-services/org.freedesktop.PackageKit.service
480 %{_mandir}/man1/pkcon.1*
481 %{_mandir}/man1/pkmon.1*
482 %{systemdunitdir}/packagekit.service
483 %{systemdunitdir}/packagekit-offline-update.service
484 %{systemdunitdir}/system-update.target.wants/packagekit-offline-update.service
485 %dir /var/cache/PackageKit
486 %dir /var/cache/PackageKit/downloads
487 %dir /var/lib/PackageKit
488 %ghost /var/lib/PackageKit/transactions.db
491 %defattr(644,root,root,755)
492 %attr(755,root,root) %{_libdir}/libpackagekit-glib2.so.*.*.*
493 %attr(755,root,root) %ghost %{_libdir}/libpackagekit-glib2.so.18
494 %{_libdir}/girepository-1.0/PackageKitGlib-1.0.typelib
495 # NOTE: dbus interface xmls are commonly used:
496 # - at runtime by packagekitd
497 # - for development of applications using PK dbus interface
498 %{_datadir}/dbus-1/interfaces/org.freedesktop.PackageKit.Transaction.xml
499 %{_datadir}/dbus-1/interfaces/org.freedesktop.PackageKit.xml
502 %defattr(644,root,root,755)
503 %attr(755,root,root) %{_libdir}/libpackagekit-glib2.so
504 %{_pkgconfigdir}/packagekit-glib2.pc
505 %dir %{_includedir}/PackageKit
506 %{_includedir}/PackageKit/packagekit-glib2
507 %{_datadir}/gir-1.0/PackageKitGlib-1.0.gir
510 %defattr(644,root,root,755)
511 %{_libdir}/libpackagekit-glib2.a
514 %files -n vala-packagekit
515 %defattr(644,root,root,755)
516 %{_datadir}/vala/vapi/packagekit-glib2.deps
517 %{_datadir}/vala/vapi/packagekit-glib2.vapi
521 %defattr(644,root,root,755)
522 %{_gtkdocdir}/PackageKit
526 %defattr(644,root,root,755)
527 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_alpm.so
528 %dir %{_sysconfdir}/PackageKit/alpm.d
529 %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/PackageKit/alpm.d/groups.list
530 %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/PackageKit/alpm.d/pacman.conf
531 %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/PackageKit/alpm.d/repos.list
536 %defattr(644,root,root,755)
537 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_aptcc.so
538 %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/apt/apt.conf.d/20packagekit
539 %dir %{_datadir}/PackageKit/helpers/aptcc
540 %attr(755,root,root) %{_datadir}/PackageKit/helpers/aptcc/get-distro-upgrade.py
541 %attr(755,root,root) %{_datadir}/PackageKit/helpers/aptcc/pkconffile
542 %{_datadir}/PackageKit/helpers/aptcc/pkconffile.nodiff
547 %defattr(644,root,root,755)
548 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_dnf.so
552 %files backend-entropy
553 %defattr(644,root,root,755)
554 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_entropy.so
555 %dir %{_datadir}/PackageKit/helpers/entropy
556 %attr(755,root,root) %{_datadir}/PackageKit/helpers/entropy/entropyBackend.py
561 %defattr(644,root,root,755)
562 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_nix.so
566 %files backend-poldek
567 %defattr(644,root,root,755)
568 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_poldek.so
572 %files backend-portage
573 %defattr(644,root,root,755)
574 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_portage.so
575 %dir %{_datadir}/PackageKit/helpers/portage
576 %attr(755,root,root) %{_datadir}/PackageKit/helpers/portage/portageBackend.py
581 %defattr(644,root,root,755)
582 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_slack.so
583 %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/PackageKit/Slackware.conf
584 %dir /var/cache/PackageKit/metadata
585 %ghost /var/cache/PackageKit/metadata/metadata.db
590 %defattr(644,root,root,755)
591 %attr(755,root,root) %{_libdir}/packagekit-backend/libpk_backend_zypp.so
594 %files gstreamer-plugin
595 %defattr(644,root,root,755)
596 %doc contrib/gstreamer-plugin/README
597 %attr(755,root,root) %{_libexecdir}/gst-install-plugins-helper
598 %attr(755,root,root) %{_libexecdir}/pk-gstreamer-install
601 %defattr(644,root,root,755)
602 %doc contrib/gtk-module/{GLASS.txt,README}
603 %attr(755,root,root) %{_libdir}/gtk-3.0/modules/libpk-gtk-module.so
604 %{_libdir}/gnome-settings-daemon-3.0/gtk-modules/pk-gtk-module.desktop
606 %files -n bash-completion-packagekit
607 %defattr(644,root,root,755)
608 %{bash_compdir}/pkcon
611 %files -n python-packagekit
612 %defattr(644,root,root,755)
613 %dir %{py_sitescriptdir}/packagekit
614 %{py_sitescriptdir}/packagekit/*.py[co]