python-pure-eval-0.2.2-1.oe2403>  <@PT@7!.ܶujG7of=4openeuler@compass-ci.com G7oZN z8k:~t<쵭 m"['^dž^ky";Buo/֤qpkUDZ."߹U#v71dB6=!LܱhW}}M{1k-GԡIX6E KF(!9s$E3YDSR%PY"n,T 3eK9wC=NEio2` 6~KӖ&~AS[1**G«/x9*/ ?2XdyGB"@_ AAji͇W#`$mj4yi,"o(1ao3Y4G֎pH16x?772b7c0c0e9980bb366d34773407198430e2ad3961cb1389d03f4eaf2526a07c07804e7d2848726e4eeeb7feb878677e80f5c7116bl7d?dd " Qx|       (89:AFGH$I,R0X4Y<\\]d^def1Cpython-pure-eval0.2.21.oe2403Safely evaluate AST nodes without side effects [![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval) This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects. It can be installed from PyPI: pip install pure_eval To demonstrate usage, suppose we have an object defined as follows: ```python class Rectangle: def __init__(self, width, height): self.width = width self.height = height @property def area(self): print("Calculating area...") return self.width * self.height rect = Rectangle(3, 5) ``` Given the `rect` object, we want to evaluate whatever expressions we can in this source code: ```python source = "(rect.width, rect.height, rect.area)" ``` This library works with the AST, so let's parse the source code and peek inside: ```python import ast tree = ast.parse(source) the_tuple = tree.body[0].value for node in the_tuple.elts: print(ast.dump(node)) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load()) ``` Now to actually use the library. First construct an Evaluator: ```python from pure_eval import Evaluator evaluator = Evaluator({"rect": rect}) ``` The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use: ```python evaluator = Evaluator.from_frame(frame) ``` Now to evaluate some nodes, using `evaluator[node]`: ```python print("rect.width:", evaluator[the_tuple.elts[0]]) print("rect:", evaluator[the_tuple.elts[0].value]) ``` Output: ``` rect.width: 3 rect: <__main__.Rectangle object at 0x105b0dd30> ``` OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception. ```python from pure_eval import CannotEval try: print("rect.area:", evaluator[the_tuple.elts[2]]) # fails except CannotEval as e: print(e) # prints CannotEval ``` To find all the expressions that can be evaluated in a tree: ```python for node, value in evaluator.find_expressions(tree): print(ast.dump(node), value) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3 Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5 Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> ``` Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together: ```python from pure_eval import group_expressions for nodes, values in group_expressions(evaluator.find_expressions(tree)): print(len(nodes), "nodes with value:", values) ``` Output: ``` 1 nodes with value: 3 1 nodes with value: 5 3 nodes with value: <__main__.Rectangle object at 0x10d374d30> ``` If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`: ```python def foo(): pass ``` If we refer to `foo` by its name as usual, then that's not interesting: ```python from pure_eval import is_expression_interesting node = ast.parse('foo').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='foo', ctx=Load()) False ``` But if we refer to it by a different name, then it's interesting: ```python node = ast.parse('bar').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='bar', ctx=Load()) True ``` In general `is_expression_interesting` returns False for the following values: - Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`) - Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method. - Builtins (e.g. `len`) referred to by their usual name. To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with: ```python evaluator.interesting_expressions_grouped(root) ``` To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens). Here's a complete example that brings it all together: ```python from asttokens import ASTTokens from pure_eval import Evaluator source = """ x = 1 d = {x: 2} y = d[x] """ names = {} exec(source, names) atok = ASTTokens(source, parse=True) for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree): print(atok.get_text(nodes[0]), "=", value) ``` Output: ```python x = 1 d = {1: 2} y = 2 d[x] = 2 ```f=dc-64g.compass-ci5MIThttp://openeuler.orgUnspecifiedpure_eval-0.2.2.tar.gzhttp://github.com/alexmojaki/pure_evallinuxnoarchKGrf=f=2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3f35c974c26cd4731516297cdc7ea3f1586ffab84b81988c84f0ae377482d7ee0 rootrootrootrootpython3-pure-evalpython-pure-eval-help  python3-develpython3-pippython3-setuptoolspython3-setuptools_scmpython3-tomlrpmlib(CompressedFileNames)rpmlib(FileDigests)3.0.4-14.6.0-14.18.2dgdPython_Bot - 0.2.2-1- Package Spec generatednoarchdc-64g.compass-ci 17153083190.2.2-1.oe24030.2.2-1.oe2403pure_eval-0.2.2.tar.gzpython-pure-eval.speccpiogzip9utf-8266902da25b7b25c1da2a921cbfabb4e78be9496eaf38924efdbbe443ba511ef2e2ff7a8f56e03ff02b9017c376a8c604b8891212111ba43cc8262c5e9ed328b Name: python-pure-eval Version: 0.2.2 Release: 1 Summary: Safely evaluate AST nodes without side effects License: MIT URL: http://github.com/alexmojaki/pure_eval Source0: https://files.pythonhosted.org/packages/97/5a/0bc937c25d3ce4e0a74335222aee05455d6afa2888032185f8ab50cdf6fd/pure_eval-0.2.2.tar.gz BuildArch: noarch Requires: python3-pytest %description [![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval) This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects. It can be installed from PyPI: pip install pure_eval To demonstrate usage, suppose we have an object defined as follows: ```python class Rectangle: def __init__(self, width, height): self.width = width self.height = height @property def area(self): print("Calculating area...") return self.width * self.height rect = Rectangle(3, 5) ``` Given the `rect` object, we want to evaluate whatever expressions we can in this source code: ```python source = "(rect.width, rect.height, rect.area)" ``` This library works with the AST, so let's parse the source code and peek inside: ```python import ast tree = ast.parse(source) the_tuple = tree.body[0].value for node in the_tuple.elts: print(ast.dump(node)) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load()) ``` Now to actually use the library. First construct an Evaluator: ```python from pure_eval import Evaluator evaluator = Evaluator({"rect": rect}) ``` The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use: ```python evaluator = Evaluator.from_frame(frame) ``` Now to evaluate some nodes, using `evaluator[node]`: ```python print("rect.width:", evaluator[the_tuple.elts[0]]) print("rect:", evaluator[the_tuple.elts[0].value]) ``` Output: ``` rect.width: 3 rect: <__main__.Rectangle object at 0x105b0dd30> ``` OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception. ```python from pure_eval import CannotEval try: print("rect.area:", evaluator[the_tuple.elts[2]]) # fails except CannotEval as e: print(e) # prints CannotEval ``` To find all the expressions that can be evaluated in a tree: ```python for node, value in evaluator.find_expressions(tree): print(ast.dump(node), value) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3 Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5 Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> ``` Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together: ```python from pure_eval import group_expressions for nodes, values in group_expressions(evaluator.find_expressions(tree)): print(len(nodes), "nodes with value:", values) ``` Output: ``` 1 nodes with value: 3 1 nodes with value: 5 3 nodes with value: <__main__.Rectangle object at 0x10d374d30> ``` If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`: ```python def foo(): pass ``` If we refer to `foo` by its name as usual, then that's not interesting: ```python from pure_eval import is_expression_interesting node = ast.parse('foo').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='foo', ctx=Load()) False ``` But if we refer to it by a different name, then it's interesting: ```python node = ast.parse('bar').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='bar', ctx=Load()) True ``` In general `is_expression_interesting` returns False for the following values: - Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`) - Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method. - Builtins (e.g. `len`) referred to by their usual name. To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with: ```python evaluator.interesting_expressions_grouped(root) ``` To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens). Here's a complete example that brings it all together: ```python from asttokens import ASTTokens from pure_eval import Evaluator source = """ x = 1 d = {x: 2} y = d[x] """ names = {} exec(source, names) atok = ASTTokens(source, parse=True) for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree): print(atok.get_text(nodes[0]), "=", value) ``` Output: ```python x = 1 d = {1: 2} y = 2 d[x] = 2 ``` %package -n python3-pure-eval Summary: Safely evaluate AST nodes without side effects Provides: python-pure-eval BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip BuildRequires: python3-setuptools_scm BuildRequires: python3-toml %description -n python3-pure-eval [![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval) This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects. It can be installed from PyPI: pip install pure_eval To demonstrate usage, suppose we have an object defined as follows: ```python class Rectangle: def __init__(self, width, height): self.width = width self.height = height @property def area(self): print("Calculating area...") return self.width * self.height rect = Rectangle(3, 5) ``` Given the `rect` object, we want to evaluate whatever expressions we can in this source code: ```python source = "(rect.width, rect.height, rect.area)" ``` This library works with the AST, so let's parse the source code and peek inside: ```python import ast tree = ast.parse(source) the_tuple = tree.body[0].value for node in the_tuple.elts: print(ast.dump(node)) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load()) ``` Now to actually use the library. First construct an Evaluator: ```python from pure_eval import Evaluator evaluator = Evaluator({"rect": rect}) ``` The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use: ```python evaluator = Evaluator.from_frame(frame) ``` Now to evaluate some nodes, using `evaluator[node]`: ```python print("rect.width:", evaluator[the_tuple.elts[0]]) print("rect:", evaluator[the_tuple.elts[0].value]) ``` Output: ``` rect.width: 3 rect: <__main__.Rectangle object at 0x105b0dd30> ``` OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception. ```python from pure_eval import CannotEval try: print("rect.area:", evaluator[the_tuple.elts[2]]) # fails except CannotEval as e: print(e) # prints CannotEval ``` To find all the expressions that can be evaluated in a tree: ```python for node, value in evaluator.find_expressions(tree): print(ast.dump(node), value) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3 Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5 Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> ``` Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together: ```python from pure_eval import group_expressions for nodes, values in group_expressions(evaluator.find_expressions(tree)): print(len(nodes), "nodes with value:", values) ``` Output: ``` 1 nodes with value: 3 1 nodes with value: 5 3 nodes with value: <__main__.Rectangle object at 0x10d374d30> ``` If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`: ```python def foo(): pass ``` If we refer to `foo` by its name as usual, then that's not interesting: ```python from pure_eval import is_expression_interesting node = ast.parse('foo').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='foo', ctx=Load()) False ``` But if we refer to it by a different name, then it's interesting: ```python node = ast.parse('bar').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='bar', ctx=Load()) True ``` In general `is_expression_interesting` returns False for the following values: - Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`) - Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method. - Builtins (e.g. `len`) referred to by their usual name. To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with: ```python evaluator.interesting_expressions_grouped(root) ``` To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens). Here's a complete example that brings it all together: ```python from asttokens import ASTTokens from pure_eval import Evaluator source = """ x = 1 d = {x: 2} y = d[x] """ names = {} exec(source, names) atok = ASTTokens(source, parse=True) for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree): print(atok.get_text(nodes[0]), "=", value) ``` Output: ```python x = 1 d = {1: 2} y = 2 d[x] = 2 ``` %package help Summary: Development documents and examples for pure-eval Provides: python3-pure-eval-doc %description help [![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval) This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects. It can be installed from PyPI: pip install pure_eval To demonstrate usage, suppose we have an object defined as follows: ```python class Rectangle: def __init__(self, width, height): self.width = width self.height = height @property def area(self): print("Calculating area...") return self.width * self.height rect = Rectangle(3, 5) ``` Given the `rect` object, we want to evaluate whatever expressions we can in this source code: ```python source = "(rect.width, rect.height, rect.area)" ``` This library works with the AST, so let's parse the source code and peek inside: ```python import ast tree = ast.parse(source) the_tuple = tree.body[0].value for node in the_tuple.elts: print(ast.dump(node)) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load()) ``` Now to actually use the library. First construct an Evaluator: ```python from pure_eval import Evaluator evaluator = Evaluator({"rect": rect}) ``` The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use: ```python evaluator = Evaluator.from_frame(frame) ``` Now to evaluate some nodes, using `evaluator[node]`: ```python print("rect.width:", evaluator[the_tuple.elts[0]]) print("rect:", evaluator[the_tuple.elts[0].value]) ``` Output: ``` rect.width: 3 rect: <__main__.Rectangle object at 0x105b0dd30> ``` OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception. ```python from pure_eval import CannotEval try: print("rect.area:", evaluator[the_tuple.elts[2]]) # fails except CannotEval as e: print(e) # prints CannotEval ``` To find all the expressions that can be evaluated in a tree: ```python for node, value in evaluator.find_expressions(tree): print(ast.dump(node), value) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3 Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5 Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> ``` Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together: ```python from pure_eval import group_expressions for nodes, values in group_expressions(evaluator.find_expressions(tree)): print(len(nodes), "nodes with value:", values) ``` Output: ``` 1 nodes with value: 3 1 nodes with value: 5 3 nodes with value: <__main__.Rectangle object at 0x10d374d30> ``` If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`: ```python def foo(): pass ``` If we refer to `foo` by its name as usual, then that's not interesting: ```python from pure_eval import is_expression_interesting node = ast.parse('foo').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='foo', ctx=Load()) False ``` But if we refer to it by a different name, then it's interesting: ```python node = ast.parse('bar').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='bar', ctx=Load()) True ``` In general `is_expression_interesting` returns False for the following values: - Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`) - Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method. - Builtins (e.g. `len`) referred to by their usual name. To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with: ```python evaluator.interesting_expressions_grouped(root) ``` To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens). Here's a complete example that brings it all together: ```python from asttokens import ASTTokens from pure_eval import Evaluator source = """ x = 1 d = {x: 2} y = d[x] """ names = {} exec(source, names) atok = ASTTokens(source, parse=True) for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree): print(atok.get_text(nodes[0]), "=", value) ``` Output: ```python x = 1 d = {1: 2} y = 2 d[x] = 2 ``` %prep cd '/home/lkp/rpmbuild/BUILD' rm -rf 'pure_eval-0.2.2' /usr/lib/rpm/rpmuncompress -x '/home/lkp/rpmbuild/SOURCES/pure_eval-0.2.2.tar.gz' STATUS=$? if [ $STATUS -ne 0 ]; then exit $STATUS fi cd 'pure_eval-0.2.2' /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . \ CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\ /usr/bin/python3 setup.py build --executable="/usr/bin/python3 -s" sleep 1 %install \ CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\ /usr/bin/python3 setup.py install -O1 --skip-build --root /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64 install -d -m755 /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64//usr/share/doc/python-pure-eval if [ -d doc ]; then cp -arf doc /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64//usr/share/doc/python-pure-eval; fi if [ -d docs ]; then cp -arf docs /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64//usr/share/doc/python-pure-eval; fi if [ -d example ]; then cp -arf example /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64//usr/share/doc/python-pure-eval; fi if [ -d examples ]; then cp -arf examples /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64//usr/share/doc/python-pure-eval; fi pushd /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64 if [ -d usr/lib ]; then find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst fi popd mv /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64/filelist.lst . mv /home/lkp/rpmbuild/BUILDROOT/python-pure-eval-0.2.2-1.oe2403.x86_64/doclist.lst . %files -n python3-pure-eval -f filelist.lst %dir /usr/lib/python3.11/site-packages/* %files help -f doclist.lst /usr/share/doc/* %changelog * Fri May 19 2023 Python_Bot - 0.2.2-1 - Package Spec generated ?&] mzڶmMOsm۶m۶m۶~nJnͽTRV~ps1j6߬`Ё ɢ42Z0Z1:X21LNLNv&n. ,͙Ӂ\y[{npԟ0Bjp1y/yjv=")Y,&e$CzmG.+XK0*$y(k}_ek{CGIovױUҗ(abusՍå5KTbnjѽ@O]UsյWٝ/o(mG.U sHv[ ly} #y|(oW{{כ#E/sc=Wp 2ѼJ;zVכ4Hkaeߨv\= |޸[ }w;bzo'YqtfJ̼m>|kqX'ܺh(0H?q I~"m,Rܶغᴩe;_|,l+4Haly ˍpŤl;vkx[RP'BkVV!m$W3Ű/Ck] 0[NOv!TgczbVwfݙʫ7+YiaḷUiCZkt4Ռ"$nY l<^[ma 9m笸{Qwݾ1u,~ho… +.nlm' KAo΄Wix'}>Rڵ Rz 9Ϫ/+tC֗GUGi8F~|֓M"; yZg;P>%=*M$uj!4kRh{ä\*6Ƿ``wXw2ey Ց,p O |3#I`q~i",I SFrڀ=!*i)k&m1 k wK .%wَ K{8㠥ozK'[& ŧyIo{H q '_D0LdHo Bq\3-KvNZ>dC8hÞ)Hw, ;ꆫٸ+ʘgv/6pMU+Jxp='U>',J uS}nG9A Zrh5N٘{Y]+ u31Q S;"LG.>"N{FZ\MO>&^&2[/M_ {|qG_=}{sx1oߗ$yX0~7'԰"<#bVKg`O×30f=nw=˅bdUya1zi;SKD }Lo8g)4gY_φ>7čo@g`!yf<}v=|ydrv H&a>@-ɪNQ ދmERamz:1 B|hQݥZ*~^x8--oV)>yBcAofj%罎V %4ӹ2_`'Du〛sK5|3x5\WU8++`oF xs/ ,˶ȺkiҵHG?aш702V =^K=Ó׌%$<#A5>v,!l;- o5ѩ\TͩRtO |heMΪ̹|H^0VDPR%lTSʡ˜0zHk"O(ˑ6cD0SkQ4Q'}=0$i/K23Yo+c-vT<,unt+=&?sXOfb^DX)\u u68CnDЁHp`dHxYZtZ Bhu) qqvr%R`Cdz?\ϥNW0,u ('JplBʒ!+~,BEY*qH,tX?~8vOI i`5aentM~$! G <_T^E (}A֨ع CT HhZ% ⪒N>eoœonvT&ή#)FӚrz3MC9-$W&jt,?YFe奸5xlmiV+ƞwTU>yc/UX+TK!$6+Qկ~y#ˏ.r CtYBGSc #D)f``˝Y?y` 듓WTE,wZl%XX0%§q60Ta;_mȴ. PJ M;1ř=^_n;+Hul^5S =z_kx.d%_@z H.4 }ZfihZeˎgzک+|m78W|>s^]6}S &c-'sQURiGc(ĉ`A}XϤǂWXNc|y,6IEaX@vvXKx -CClFw7TQY^eM[ZfLqdS-zw뇁I\Oҫn5Y\s#H|vyT-;?o Gјw϶ЏPɷ9?AC,)̓ 5ŲZ1PO*uGsԣv]$GSȜ7fĈ%(ۻ&)FY>Ǹ+h@w ⭇ xynr]MC>jb~?)GPc)gR7_ԙR"Mcr}r:U`{EleŐ8<6p~$Lm[X۲bٍڽE{{H 6] >GB?>F)f!u@dO'{?@ Ih 88Sc 7mKs3T3h#p ڜSsL75gx=8EI#eruLzC{һ{e~!9ѼasO}v*<`3VT ^a\Vd?|(ːI Od;K32fl7֘pGLuâWE2O8["X42e{vrSt'WBwΘ¹Z+\Fb/h\!#y[K›[J>}A5G32rDu' /[)iS9h Kk`9bz":H f'^TA-'y\/">ۗBXO羊n_gb@e%IȩLuE)Lc.Rpt]Ԛch }!XFy5J)s'7/O~Œni_[gO];qΨ~.f\H=U77;/_MEJjOHSj {1 lSor), q7YL>fn@PmN+&ks7:rpM!=J20b4h-9_=*Mե/3&kˠ{C/>sa >t!T(?~*:ftbpIн%IVb?^`"xZ'5k+akjKE6-_ 5dcN2'3ja%^ e&A2QA $+ $HDu2%$2QsGֹhhyyݚE= }1-ըX|o߬F0MZۨ>71+{[tkqou_;xn'267%pQ.bUpfF+\cp4Xxf*&Ɵ6`1[ 40rܩ̡1¤~Ћ } `|uӒʣVΡ ;ү>zLzH"XVl*Ȼ'O6YqvWC#!+ %]F{>ǜg>? ə_䄱ڟRMq^+Zq-<!eG=<̋^@%sYޥ;Ckh୓ڹs6Ipl^9N)K% Ja!VL6As?2W}m)oqr^O;2#ȷ4JC9yZIqbJ@HŌHm$pzW|9<m^]tݖH/BҜa-Y{+锒мdc~0"!Ć+#.ѭo,Lr,W^XށHUrVX88@$=Z͇a=a?ijpTe#Mv0^1,A/`$`_;B?! i1ʷ% H;ު>$v&shL洉Ij jͪ4{2&Saqt[ él̯)֣zO ף/Sijߓ:)% L繮2kޝag^T_Ɠ㫝- [+\8e_ĩ cKnVeB*RYa;ܪp:vu1@-LGw12j6VS39bg-$6ј(lmL(o#~XBꄐ12e멨iz1FMew.-eRCC(K}6~ M#E0sPn#Jh ccUKvF]M83~^>FO^-Si-<ܑ /j+HG$ Y+bLY}^"}pAWF \~=ʋo[P+ 16uftgEmo$`^y|HtCT<IJDIr\JrY7 6@4U:jnt.N-<ʗHk Fk13LR4/ ݙ8!or[C4MDٱO'A[d>L*LPNlf//y"E9!DQ4<,:Z]ڜ'\F9%쌧9Wl+t< 7V +KUX*lY˿O.(F#J`!5p(Xbϑ֗,NBԽS"|kA(1@(N8Е^`ctfG(xڼ&c(B҇L? Уh.PV*OXk 窖KU46t0.Ӏ6? )obMUf!eti,d.--=1*14G}O1Ei4u;CX5i#۷9tKh鳷S@-&sv!Mz)`/r2VXwW㺴UX0)ӴHرB[?P|Z 9k/$;fօ9I s0VLaW^ rfl^gcuƼ MpauDr(^{+ũ{WywYAҳ6W/JɮCDܳB_D;Lm'@qTmu;MKV{];setߡ5[o5:XMS)eA|/JY* "&6!4Qn Nga[gXy&F½UT`~4}o .ht+H~T`?Cp6΁tD?Bѣgq"ujRJIXJ*jگLDqr^1 ۃl" w񸶓F >xE y1@5_"oѽOj@-t- 6бqz񎘈P<]'9cAhGVTWn %l}{Η@ӇG}T?jB25l"V?RXOhJ{64Ym1i!HIejqVAmʙ sr4ùM_˱T% >?52Q[=p||`*t>~W78$K{sYŔ^di*w^YR/3oG&bC$"eE>;xOHd.mSջōGpyͣN ~O$&wWƦW֭ղQw)#hCD23|]ZQ:YЅ/nz9dT Q*jg*8|!j 5m988Ndve$1Cpa:X5qhh.!=4q(˳ߜ@AnK^f.hmCdr &$}I; ISQ 5'n9KEJsBDSNn-k,f9@G#*YnJ%R K6O֞Qq|!=limrQJn-dEj̰k*҇b6PysԠF=j@PH4 5ͱUL}z]0S+=O7_{=-yCמۂ,_YW P`w gYGH>AA,tck h[cePmIb3$ !҃wۋ/2o狲Wˤ> קuBdNS,H76McRW?L\&bt CpXZԪ+=ǽ-w*ˢB8\Z*4N!8/-]D_u<_z6{1ϱ*k0^iM݌RQSoO|b}"kt3K]&KUZӋ &jb끗͘!?Q` &jI%*il'MFp+5#PlIpJI#_|"`AU-Z6V h 0%1, IP%vK0V٫\ o[NlV*rF[$a'WĴH_H< ߷.),B ϕ$~pR6fᚧ;zOh:n[^iQ]ؾPhYDl"Lu8/?QhE&rF_-Uԏʯs"1VF7+N!h79đ|$H R1RaICU:0k,ʨH9<qd(e{<'oI0޾}b{S~Ktw; Ek Pl^"oYSN(<"c/o*|σ,Fs6W3e*Snth^6HugJN\AP:8e;CwABnPU<)"+[џ]XSNBDoa~_܇R^s_ygpd*+NsJ Z m@ybt3|@/m/mǷmGo P({7N]mT޹ިaZpY[h5): '|zq%Z^l:5;k{]MM @q[zWl~  _&_%Y 4LQ|)L:]BO dtvvbFG^cnB gSmRzi^Ӥfh{bONwoRbw+=S\nB_了dgb>,C(11P^O $ԇ $ +ӽ.^¸AtJG($'KaRRv^Y˻ #lyD5 wME GܤTi lErO jPDԓB%SG<Ol4 ) 8Ͼ\7};*veu|XMvZ706rPf&޶=-' .-%:ukP=ۻec^'s[&gƛқԓ&MA(zWz AF& 9x]_\>3O93=jL5I qHKWwӿK*|HL%#=Վ蝆4UFMS`7*br&Y97A?H,X\3M"w >BwHcPE=5B)wgt덚 q 8  H"r]]Ik%Mp;[k>=uo2aր~H,T,"E%j%Bu\'e2 ٫˷Z䲑))\. Wai9i;ϣ=Lr"EZcJdB=)9f Dyޯ{D?9 >'+,S= BHdOeqFN zx7wZ3 -r7RQO#&8}#cDaz{mԙZ9dULYy$<}d&u \S/Eb>9:d> 3`lN]A^#{=X1 ~n1ؒI oLvPR;=6h'WGmWYTCf!} L'ġaC= QVA]tvwELKWfY#l?D. NrmfYw@Y\ol| [YXpbT(Q1{¿UJC-%M>vT.sU 7j}_͙5,*Aτ1FSŁ_KMiano@l;7 mX\LBJnb{z&h~TJ?zOq\QN}irB|7zFw|FF} 槽-f@8 Hڪ*#YN}/o,5*MURn0]u WJl K=SiAtNK,ytG^&ؼؾPT^aS1 ߊ%#P)Xx1dL>PUsVdyf8!)>pb֠pU5"9t/ݔah.'4]=#EkM$m4g97m@5/~ @>z?'j➠ם`,2_9 G,k}o^WD+><'Z+zpt 8>qSxq^|}rQzq!>DǯWgWG6tL Yɴ'+{R$A-P$X Ꚃ܋xrQJ'cb IHAB^K288߫ivVW@LsT\,:AI"c|hRbPeSgŖ Ԝ_ g_xr߀OJ5+si0z.|nNvrO_l僧њ0 h#NhzsS'DOZI7|^ _o9WW7=|'~+-v[z>z_s>%WA=_f\]bg޾W:٤vH{DgXG{U.Fq ܖ<w 9|Sm t%⣚*_Bտ?8y<yzA\j 2wC)bUK:*Fbhb]@QYC¢j!-`N+@Ark8"B|3Ǒ|h̿h׻g%QC$10X$Dyw{ 8qiwЛ x̻{|F<7p2B W{N3<%_&K `EO ifKHTh!\q+c8!:֗]5(\FiJ+翦??}/9Kw@ 苞y:Á `[< Fu[WBI 𞆘3bLU@GbB3v `RtM J>_5 3Ix9}l!dڵ?)hNiQ 8$lI:76Q7Mv64(m1H?9&rhº({!W|uFi#G1l?F8ƳovXt ]˂,Cbҧ")1Zj.j>c'_m^Ho,H7bՅ :ϵ!##7 /ɺ\‰|O0/h4!$o*zI&wJU5ԓװW)"klR_c#(i i )sH¢[Fc_Nn.d۞QBE(V7՟ WƎSQx:CiS1Qʮ\6/!l,8wt¡&XYW'MNljSeTfD5<[zfnVu}G;8/)[[/ 2x)kW g J!Rz`EqR탩a r`xfўd.m{fA8еTWUm*VwH8>{+p@VלO~clKCspM5|ZCƗ`ά6c¡ߢYza,ڛTBI0_|qO-젱'uC[pCL Rq]}9_ZVU;,#.Ŵ9u:z1EA%AnHp9%Rg `GPymWESK-Z[+È2mL[} R4i=6* ɣe"ܠ!V ڸFez"+ jzScTS@A=ozTM A-=cwy?Es?(z{5i`3<+Ow¼./թ`d_G_OLTtwZr.@2׸Ԁ1kn\qBCPnADE9^QKϺi(Ixz.0iI)˱91ϨF5=OidZx0r!//\@ akB+k8vw~'hPN#!T~k)]J&16PU&vP-JHݴU$ =`oP~ %r<0M+q+Z DW*V媼 ٽ2|Gأ 1o>1b[2%)E~x) _6!YVGQ0 ^vZmVl9./(XKSUZlpO2k4'ST٬W.v.~*/L)?V?ReV>2s]T{%#OTG{k}]#%wrw8kgGZ^hJ]럭MCYPmص6#K6ET_aUⅱN;m2.'k"e]+ʀ" B +HQ1L&d ę Ulk],PłW.,VT~ϊ"IAqG#{=SPF,Jpl:9j܁٨[&l&[T|c+f*ADifIf~\TlsmhTD0apYY yS۵ 22톽_O NѼeo!:.}}Ae{/uLi$:tZ%|}9-$1/ig+[[u;|G[>~ioqJ_FX<_6UouuhGɖ[lTi{ k)~.>!`K?ņ[5yΤfَZ%:I:?Ya_{s~Sĥ=xk/+W^ޭڴx_ZMvnMdi͎~gﻋ5O_ ?W<]VX>6%/E&튶:өn/z m_}%$Ѿ%f6~Դ4ƨ7|?c^Zdfiq2~տ ܕ҉VmVv:cUUY%\^.>}`Fs# kO7<}1» \/,=Lpby?N}M?1rɦ #R.l8c|n(NJR쪙Am'uݸyPp̰¯H][<[5[.RX.Vt%ptSX8z%||K|d;rd6]4bG{:^-طmsglۖ=pr=-|;}e}u{!W2CZܩ#p!ӑ߅N|(,{to%Mn|]&o7g/l:,ҺF?] y7d=h!&w\pޣoqF~3{I~IW~# rj9Ȧmr.%9ۡZ^wpf/+9Ţ>ey܋[&Yvȵcdzp'=E'{v9i6H|ՑY5nr$-nA{D+}oHx|٢ҊCg?>u{$J~{zΙs㚐w /GnflFyqRQG{ Rss\[n!bYvս#Ho;;Ar/.w蔚4ԮnZ}[oMXҴx8Uc~>]sPDƻgُ?;5161s>xv ]1«2FbcJ*wk {,+zkmv̂Oޖ|K!uf{_ݵQFwWn?0qԮ! 'PvB#)[).3;,mnQ1n})ג ]mﴵ&Y>3j[=U6k:|h]<2Vכ[8%ܸū N]XTJ0sZ4p8 %_,^lA쐁!jDsmocӅvqV랱^Ob`&v|#J.K[ahEVl>W3!ǂ1Gl>|HŽSS4㭦Jd[3̚ˣ14-EqJWv\`i+Oϭz|}G'eTnhq~5>W,f/yVU 9ewT@QW0-x*ZMSð{-*[R<2:eYhH\µeg_6݁Ga[WϠ;/fvr=Wy5wTu+o _/zeߛÐ[%K]'9mԝ<˫Z|ٜG9HV w>-;r9}j-Y3\UlY"3xJBI5wQ𹃓s_owhۛDWY |ѷ4>#J[fo1GVhJ񩟋_ /LnZt_v25 ݕ9_D =xzqjDBɛtsdK72h:-9IYWĶvly59l𞬐̘zdQC'(d?6qmĔ7|CKs YvoN|s ?> mU} C}bmN~tϷYS-N'>?mGSvQë#kZmͪg}zl&Ͼ=`z7Ji9póǚ0WJT>Kß?8miM'2&oVʯK$W"ۮ 7~k7Yo><% s*hBd.1.޽]bKfLh !VE0*!Z6Y4`X KjRD#UrTcjS6pfHJeɽS #TJW$\Vcte8 T($hTC M$72@ YBD R,rq: TfZ3$8!@AF߳bXB.X-cҧ"}zbN"X,B!)0Md"\襐46dT[WzYj( DjH` Jts?I- tGFRx,^XK gԐ>LBl?ipr> dD%4gqnBb$BZ1A^.2LK1 V0 i2h(X4A &N2JP9d-`\K\_o&t{Ψ%P a JEUX2CO'h#5 KMjbQTt2=G5*i1 pz#D 1 *#PRð@DASj /AGKjkgѺB"(TN:PG!@`@ `iXAj{AJE%2T* UàaĪ/N4XJ$d%Cpr9JU|=Y!7zO9hZ&a4qLXk~YO ש0Vl |#M:Zc 'SP uG P>T ،@LjPZe:wH%3Dށ!$ c8\ ި= =wjOȷs[) ;R~OSy4Cp&N G݈dC$ "&c3#iUp e<9Z#*!Esq?THXFoD![NARA!:Vc? Jc 3)vzq8=<>_bۑbFo'\SБ0Ձ`N1Bԟ\P뀷{EF0@ F4"Q,fM{q.Ư.!tNM\j @9>a̴Z{&1p P4!4J*80@1x,Dƨnn)VQ {`rz*hB9 Ǚ__f( r` O%51z T^nE}7]b}4@ԍ(HF(xrDI"H.w əDNi H@ (CNR! (]SAXaqF"LA6Q+dW zr8&czo MR'H*Q! R@$ed`$OP,/Np5AQ\)"wshwT*6a 3*aʖਹgT>(88HlP]9ӎթ*ơn}0`@r Ab™ &ۘ \Q/VɅ/6b •W`iIV 4K!xQ/DB,kSi DI8c<BdAm%KS:-$T%IA*SC s:׼r/+`0%5g/@5n묩G"REP38.Wcp}Bu"RTzߠYhKJ@R:[$ajd \ PNC E `%y:W\ʒV3\%PǀF)%䙿G$cUU#؅#S?E<=~QC_c*/EH@U*'TAS$ӗteqd(#hA /.j 銃. +)A8CHrcP!RWTJ1]X/x(dvIpCʠ@&Vj^  *`D%) $1 0rMn H3pRr!{C@A,$\q;r7Th`Ct]ySj(z=P&p_(xR.&V4Eg 'hb"dhj(4C(5xh,OhL:W&]X 1.F:>PN ؑ#30ϟ2i/1#Z{~Ӫ#I+"&y4$<ʣb8/K`2 n_ (>ƃYp<0S9nxzN_$(@GHb L_-Mj<uPss֠IO[ѡ4[&,-]9@|q e) _Вگ/0KT,V'7sd67Mfsd67Mfsd67Mfsd67Mfsd67Mfs&PiaϗrP9sQXE+꺯M:΀A-'ܯ5kZsܯ5kZsܯ5kZsܯ5kZsܯ5kZsܯ߯ -XYoa뿯qon]!CL?X1,Gս=