Kivy-examples 2.3.1.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (624) hide show
  1. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/main.py +77 -0
  2. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/monkey.obj +7966 -0
  3. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/objloader.py +147 -0
  4. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/3Drendering/simple.glsl +47 -0
  5. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/editor.kv +72 -0
  6. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/RST_Editor/main.py +64 -0
  7. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/android.txt +3 -0
  8. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/compass.kv +25 -0
  9. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/main.py +77 -0
  10. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/needle.png +0 -0
  11. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/compass/rose.png +0 -0
  12. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/android.txt +3 -0
  13. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/main.py +80 -0
  14. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/shadow32.png +0 -0
  15. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/android/takepicture/takepicture.kv +40 -0
  16. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/animation/animate.py +42 -0
  17. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite.py +152 -0
  18. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_suite_data/testkvdir.kv +4 -0
  19. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_build.py +24 -0
  20. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_config.py +49 -0
  21. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv.py +25 -0
  22. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/app_with_kv_in_template1.py +27 -0
  23. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/template1/test.kv +4 -0
  24. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/test.kv +4 -0
  25. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/application/testkvfile.kv +4 -0
  26. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_advanced.py +90 -0
  27. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/asyncio_basic.py +59 -0
  28. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_advanced.py +93 -0
  29. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/async/trio_basic.py +58 -0
  30. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12908_sweet_trip_mm_clap_hi.wav +0 -0
  31. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12909_sweet_trip_mm_clap_lo.wav +0 -0
  32. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12910_sweet_trip_mm_clap_mid.wav +0 -0
  33. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12911_sweet_trip_mm_hat_cl.wav +0 -0
  34. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12913_sweet_trip_mm_kick_hi.wav +0 -0
  35. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12914_sweet_trip_mm_kick_lo.wav +0 -0
  36. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12915_sweet_trip_mm_kick_mid.wav +0 -0
  37. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12916_sweet_trip_mm_kwik_mod_01.wav +0 -0
  38. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12917_sweet_trip_mm_kwik_mod_02.wav +0 -0
  39. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12918_sweet_trip_mm_kwik_mod_03.wav +0 -0
  40. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12919_sweet_trip_mm_kwik_mod_04.wav +0 -0
  41. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12920_sweet_trip_mm_kwik_mod_05.wav +0 -0
  42. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12921_sweet_trip_mm_kwik_mod_06.wav +0 -0
  43. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12922_sweet_trip_mm_kwik_mod_07.wav +0 -0
  44. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12923_sweet_trip_mm_metal_clave.wav +0 -0
  45. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12925_sweet_trip_mm_sweep_x.wav +0 -0
  46. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12926_sweet_trip_mm_sweep_y.wav +0 -0
  47. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/12927_sweet_trip_mm_sweep_z.wav +0 -0
  48. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/audio.kv +59 -0
  49. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/main.py +81 -0
  50. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/audio/pitch.py +42 -0
  51. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/camera/main.py +59 -0
  52. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/bezier.py +105 -0
  53. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/canvas_stress.py +72 -0
  54. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/circle.py +84 -0
  55. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/fbo_canvas.py +91 -0
  56. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/kiwi.jpg +0 -0
  57. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines.py +296 -0
  58. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/lines_extended.py +183 -0
  59. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh.py +57 -0
  60. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mesh_manipulation.py +101 -0
  61. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture1.png +0 -0
  62. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/mtexture2.png +0 -0
  63. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/multitexture.py +110 -0
  64. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/repeat_texture.py +65 -0
  65. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rotation.py +35 -0
  66. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/rounded_rectangle.py +153 -0
  67. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/scale.py +37 -0
  68. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/stencil_canvas.py +85 -0
  69. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/tesselate.py +146 -0
  70. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture.py +143 -0
  71. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/canvas/texture_example_image.png +0 -0
  72. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/1.kv +28 -0
  73. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/2.kv +28 -0
  74. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/3.kv +28 -0
  75. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/kv/root.kv +32 -0
  76. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/container/main.py +63 -0
  77. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_image.py +25 -0
  78. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/cover/cover_video.py +31 -0
  79. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/camera_puzzle.py +98 -0
  80. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/AnchorLayoutContainer.kv +15 -0
  81. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/BoxLayoutContainer.kv +14 -0
  82. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ButtonContainer.kv +27 -0
  83. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/CheckBoxContainer.kv +28 -0
  84. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FileChooserContainer.kv +19 -0
  85. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/FloatLayoutContainer.kv +16 -0
  86. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/GridLayoutContainer.kv +20 -0
  87. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/LabelContainer.kv +62 -0
  88. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/MediaContainer.kv +9 -0
  89. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PlaygroundContainer.kv +4 -0
  90. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/PopupContainer.kv +39 -0
  91. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ProgressBarContainer.kv +17 -0
  92. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/RestContainer.kv +5 -0
  93. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/ScatterContainer.kv +16 -0
  94. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/SelectorsContainer.kv +10 -0
  95. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/StackLayoutContainer.kv +25 -0
  96. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/container_kvs/TextContainer.kv +20 -0
  97. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/kivycatalog.kv +144 -0
  98. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/kivycatalog/main.py +192 -0
  99. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.kv +117 -0
  100. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/gesturedatabase.py +180 -0
  101. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/helpers.py +30 -0
  102. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.kv +164 -0
  103. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/historymanager.py +276 -0
  104. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/main.py +144 -0
  105. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/multistroke.kv +101 -0
  106. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.kv +110 -0
  107. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/multistroke/settings.py +97 -0
  108. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/android.txt +3 -0
  109. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Bubbles.jpg +0 -0
  110. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Ill1.jpg +0 -0
  111. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/Wall.jpg +0 -0
  112. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/images/faust_github.jpg +0 -0
  113. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/main.py +73 -0
  114. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/pictures.kv +57 -0
  115. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/pictures/shadow32.png +0 -0
  116. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/main.py +147 -0
  117. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/shadereditor/shadereditor.kv +39 -0
  118. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/README.txt +11 -0
  119. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/android.txt +3 -0
  120. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/background.png +0 -0
  121. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/faust_github.jpg +0 -0
  122. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/README +4 -0
  123. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/bug.png +0 -0
  124. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-left.png +0 -0
  125. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/icons/chevron-right.png +0 -0
  126. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/accordions.kv +39 -0
  127. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/bubbles.kv +33 -0
  128. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/buttons.kv +26 -0
  129. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/carousel.kv +51 -0
  130. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/checkboxes.kv +33 -0
  131. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/codeinput.kv +9 -0
  132. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/dropdown.kv +40 -0
  133. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/filechoosers.kv +24 -0
  134. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/popups.kv +17 -0
  135. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/progressbar.kv +15 -0
  136. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/rstdocument.kv +24 -0
  137. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/scatter.kv +14 -0
  138. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/screenmanager.kv +46 -0
  139. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/sliders.kv +55 -0
  140. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/spinner.kv +11 -0
  141. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/splitter.kv +13 -0
  142. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/switches.kv +39 -0
  143. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/tabbedpanel + layouts.kv +69 -0
  144. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/textinputs.kv +48 -0
  145. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/data/screens/togglebutton.kv +39 -0
  146. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/main.py +243 -0
  147. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/showcase/showcase.kv +100 -0
  148. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/README.txt +12 -0
  149. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/android.txt +3 -0
  150. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/icon.png +0 -0
  151. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/main.py +170 -0
  152. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/particle.png +0 -0
  153. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/demo/touchtracer/touchtracer.kv +29 -0
  154. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_client_app.py +82 -0
  155. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/echo_server_app.py +49 -0
  156. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/frameworks/twisted/twistd_app.py +66 -0
  157. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/gesture_board.py +95 -0
  158. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/gestures/my_gestures.py +90 -0
  159. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/controller.kv +16 -0
  160. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/designwithkv/main.py +29 -0
  161. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/1_skeleton.py +15 -0
  162. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/2_print_touch.py +16 -0
  163. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/3_draw_ellipse.py +22 -0
  164. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/4_draw_line.py +26 -0
  165. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/5_random_colors.py +28 -0
  166. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/firstwidget/6_button.py +38 -0
  167. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/guide/quickstart/main.py +15 -0
  168. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/button.kv +9 -0
  169. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/layout.kv +6 -0
  170. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/main.py +19 -0
  171. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/includes/test.kv +5 -0
  172. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/android.txt +3 -0
  173. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/main.py +226 -0
  174. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/keyboard/numeric.json +38 -0
  175. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/README.txt +13 -0
  176. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kinect/kinectviewer.py +283 -0
  177. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_button.kv +9 -0
  178. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_camera.kv +25 -0
  179. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_fbo.kv +11 -0
  180. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_layout.kv +23 -0
  181. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_logo.kv +36 -0
  182. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_scatter.kv +6 -0
  183. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_stencil.kv +27 -0
  184. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/app_video.kv +42 -0
  185. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/builder_template.py +28 -0
  186. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/id_in_kv.py +20 -0
  187. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/id_in_kv/test.kv +11 -0
  188. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/kv_and_py.py +34 -0
  189. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/ids/kv_and_py/test.kv +11 -0
  190. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kivy.jpg +0 -0
  191. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/kv/kvrun.py +38 -0
  192. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/clipboard.py +63 -0
  193. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/custom_titlebar.py +56 -0
  194. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/imagesave.py +14 -0
  195. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/joystick.py +83 -0
  196. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/multiple_dropfile.py +51 -0
  197. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/on_textedit_event.py +104 -0
  198. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/opacitywindow.py +28 -0
  199. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapecollisions.py +397 -0
  200. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/shapedwindow.py +98 -0
  201. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/two_panes.py +47 -0
  202. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/miscellaneous/urlrequest.py +128 -0
  203. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/android.txt +3 -0
  204. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/settings/main.py +122 -0
  205. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.kv +9 -0
  206. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/plasma.py +86 -0
  207. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.kv +91 -0
  208. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/rotated.py +102 -0
  209. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.kv +29 -0
  210. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/shadertree.py +193 -0
  211. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/shader/tex3.jpg +0 -0
  212. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/benchmark.py +19 -0
  213. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/cloud.svg +25 -0
  214. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main-smaa.py +155 -0
  215. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/main.py +50 -0
  216. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/music.svg +68 -0
  217. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/rotated.svg +23 -0
  218. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/ship.svg +181 -0
  219. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/sun.svg +35 -0
  220. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/svg/tiger.svg +813 -0
  221. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/text/pango_demo.py +296 -0
  222. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/data/icon.png +0 -0
  223. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/main.py +163 -0
  224. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/notes/final/note.kv +154 -0
  225. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/main.py +82 -0
  226. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/pong.kv +53 -0
  227. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/main.py +15 -0
  228. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step1/pong.kv +2 -0
  229. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/main.py +15 -0
  230. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step2/pong.kv +21 -0
  231. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/main.py +26 -0
  232. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step3/pong.kv +31 -0
  233. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/main.py +48 -0
  234. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step4/pong.kv +34 -0
  235. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/main.py +75 -0
  236. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/tutorials/pong/steps/step5/pong.kv +53 -0
  237. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/accordion_1.py +17 -0
  238. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/actionbar.py +32 -0
  239. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/asyncimage.py +35 -0
  240. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/boxlayout_poshint.py +54 -0
  241. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/bubble_test.py +63 -0
  242. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/camera.py +33 -0
  243. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/carousel_buttons.py +50 -0
  244. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.mpg +0 -0
  245. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/cityCC0.png +0 -0
  246. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinput.py +225 -0
  247. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/codeinputtest.kv +53 -0
  248. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorpicker.py +234 -0
  249. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/colorusage.py +62 -0
  250. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/compound_selection.py +83 -0
  251. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/customcollide.py +82 -0
  252. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget.py +193 -0
  253. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget2.py +47 -0
  254. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/effectwidget3_advanced.py +62 -0
  255. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/fbowidget.py +111 -0
  256. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/focus_behavior.py +98 -0
  257. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/image_mipmap.py +31 -0
  258. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/keyboardlistener.py +42 -0
  259. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_mipmap.py +28 -0
  260. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_sizing.py +193 -0
  261. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_text_size.py +49 -0
  262. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/label_with_markup.py +21 -0
  263. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/lang_dynamic_classes.py +18 -0
  264. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/pagelayout.py +64 -0
  265. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/popup_with_kv.py +35 -0
  266. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/basic_data.py +124 -0
  267. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/infinite_scrolling.py +143 -0
  268. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/key_viewclass.py +149 -0
  269. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/messenger.py +196 -0
  270. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/pull_to_refresh.py +95 -0
  271. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/recycleview/rv_animate_items.py +109 -0
  272. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/rstexample.py +128 -0
  273. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.kv +53 -0
  274. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scatter.py +16 -0
  275. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/screenmanager.py +106 -0
  276. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.kv +16 -0
  277. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/scrollview.py +40 -0
  278. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/android.txt +3 -0
  279. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/bird.zip +0 -0
  280. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white.png +0 -0
  281. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/button_white_animated.zip +0 -0
  282. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/cube.zip +0 -0
  283. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.png +0 -0
  284. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/info.zip +0 -0
  285. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/data/images/simple_cv_joint_animated.gif +0 -0
  286. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.kv +63 -0
  287. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/main.py +150 -0
  288. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/__init__.py +7 -0
  289. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/sequenced_images/uix/custom_button.py +98 -0
  290. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/settings.py +93 -0
  291. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/shorten_text.py +80 -0
  292. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/spinner.py +17 -0
  293. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/splitter.py +74 -0
  294. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbed_panel_showcase.py +316 -0
  295. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/tabbedpanel.py +50 -0
  296. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.kv +49 -0
  297. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textalign.py +48 -0
  298. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/textinput.py +59 -0
  299. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/unicode_textinput.py +244 -0
  300. Kivy_examples-2.3.1.dev0.data/data/share/kivy-examples/widgets/videoplayer.py +26 -0
  301. Kivy_examples-2.3.1.dev0.dist-info/AUTHORS +66 -0
  302. Kivy_examples-2.3.1.dev0.dist-info/LICENSE +21 -0
  303. Kivy_examples-2.3.1.dev0.dist-info/METADATA +382 -0
  304. Kivy_examples-2.3.1.dev0.dist-info/RECORD +624 -0
  305. Kivy_examples-2.3.1.dev0.dist-info/WHEEL +5 -0
  306. Kivy_examples-2.3.1.dev0.dist-info/dependency_links.txt +1 -0
  307. Kivy_examples-2.3.1.dev0.dist-info/top_level.txt +1 -0
  308. kivy/__init__.py +519 -0
  309. kivy/_version.py +18 -0
  310. kivy/animation.py +831 -0
  311. kivy/app.py +1213 -0
  312. kivy/atlas.py +456 -0
  313. kivy/base.py +617 -0
  314. kivy/cache.py +262 -0
  315. kivy/clock.py +1172 -0
  316. kivy/compat.py +82 -0
  317. kivy/config.py +1004 -0
  318. kivy/context.py +102 -0
  319. kivy/core/__init__.py +247 -0
  320. kivy/core/audio/__init__.py +223 -0
  321. kivy/core/audio/audio_android.py +104 -0
  322. kivy/core/audio/audio_avplayer.py +82 -0
  323. kivy/core/audio/audio_ffpyplayer.py +185 -0
  324. kivy/core/audio/audio_gstplayer.py +101 -0
  325. kivy/core/audio/audio_pygame.py +127 -0
  326. kivy/core/camera/__init__.py +151 -0
  327. kivy/core/camera/camera_android.py +206 -0
  328. kivy/core/camera/camera_gi.py +170 -0
  329. kivy/core/camera/camera_opencv.py +163 -0
  330. kivy/core/camera/camera_picamera.py +96 -0
  331. kivy/core/clipboard/__init__.py +157 -0
  332. kivy/core/clipboard/_clipboard_ext.py +36 -0
  333. kivy/core/clipboard/clipboard_android.py +91 -0
  334. kivy/core/clipboard/clipboard_dbusklipper.py +41 -0
  335. kivy/core/clipboard/clipboard_dummy.py +26 -0
  336. kivy/core/clipboard/clipboard_gtk3.py +47 -0
  337. kivy/core/clipboard/clipboard_nspaste.py +44 -0
  338. kivy/core/clipboard/clipboard_pygame.py +67 -0
  339. kivy/core/clipboard/clipboard_sdl2.py +36 -0
  340. kivy/core/clipboard/clipboard_winctypes.py +107 -0
  341. kivy/core/clipboard/clipboard_xclip.py +29 -0
  342. kivy/core/clipboard/clipboard_xsel.py +26 -0
  343. kivy/core/gl/__init__.py +90 -0
  344. kivy/core/image/__init__.py +996 -0
  345. kivy/core/image/img_dds.py +40 -0
  346. kivy/core/image/img_ffpyplayer.py +87 -0
  347. kivy/core/image/img_pil.py +123 -0
  348. kivy/core/image/img_pygame.py +119 -0
  349. kivy/core/image/img_sdl2.py +66 -0
  350. kivy/core/image/img_tex.py +58 -0
  351. kivy/core/spelling/__init__.py +135 -0
  352. kivy/core/spelling/spelling_enchant.py +50 -0
  353. kivy/core/spelling/spelling_osxappkit.py +64 -0
  354. kivy/core/text/__init__.py +1090 -0
  355. kivy/core/text/markup.py +893 -0
  356. kivy/core/text/text_pango.py +145 -0
  357. kivy/core/text/text_pil.py +84 -0
  358. kivy/core/text/text_pygame.py +117 -0
  359. kivy/core/text/text_sdl2.py +50 -0
  360. kivy/core/video/__init__.py +219 -0
  361. kivy/core/video/video_ffmpeg.py +106 -0
  362. kivy/core/video/video_ffpyplayer.py +449 -0
  363. kivy/core/video/video_gstplayer.py +140 -0
  364. kivy/core/video/video_null.py +12 -0
  365. kivy/core/window/__init__.py +2515 -0
  366. kivy/core/window/window_egl_rpi.py +86 -0
  367. kivy/core/window/window_pygame.py +441 -0
  368. kivy/core/window/window_sdl2.py +999 -0
  369. kivy/deps/__init__.py +6 -0
  370. kivy/effects/__init__.py +23 -0
  371. kivy/effects/dampedscroll.py +114 -0
  372. kivy/effects/kinetic.py +193 -0
  373. kivy/effects/opacityscroll.py +27 -0
  374. kivy/effects/scroll.py +126 -0
  375. kivy/event.py +12 -0
  376. kivy/eventmanager/__init__.py +185 -0
  377. kivy/extras/__init__.py +0 -0
  378. kivy/extras/highlight.py +52 -0
  379. kivy/factory.py +190 -0
  380. kivy/factory_registers.py +201 -0
  381. kivy/garden/__init__.py +186 -0
  382. kivy/geometry.py +121 -0
  383. kivy/gesture.py +424 -0
  384. kivy/graphics/__init__.py +126 -0
  385. kivy/graphics/cgl_backend/__init__.py +0 -0
  386. kivy/input/__init__.py +39 -0
  387. kivy/input/factory.py +35 -0
  388. kivy/input/motionevent.py +587 -0
  389. kivy/input/postproc/__init__.py +27 -0
  390. kivy/input/postproc/calibration.py +200 -0
  391. kivy/input/postproc/dejitter.py +74 -0
  392. kivy/input/postproc/doubletap.py +101 -0
  393. kivy/input/postproc/ignorelist.py +47 -0
  394. kivy/input/postproc/retaintouch.py +93 -0
  395. kivy/input/postproc/tripletap.py +106 -0
  396. kivy/input/provider.py +40 -0
  397. kivy/input/providers/__init__.py +68 -0
  398. kivy/input/providers/androidjoystick.py +117 -0
  399. kivy/input/providers/hidinput.py +778 -0
  400. kivy/input/providers/leapfinger.py +113 -0
  401. kivy/input/providers/linuxwacom.py +396 -0
  402. kivy/input/providers/mactouch.py +220 -0
  403. kivy/input/providers/mouse.py +424 -0
  404. kivy/input/providers/mtdev.py +380 -0
  405. kivy/input/providers/probesysfs.py +254 -0
  406. kivy/input/providers/tuio.py +326 -0
  407. kivy/input/providers/wm_common.py +162 -0
  408. kivy/input/providers/wm_pen.py +121 -0
  409. kivy/input/providers/wm_touch.py +157 -0
  410. kivy/input/recorder.py +335 -0
  411. kivy/input/shape.py +27 -0
  412. kivy/interactive.py +335 -0
  413. kivy/lang/__init__.py +883 -0
  414. kivy/lang/builder.py +1004 -0
  415. kivy/lang/parser.py +822 -0
  416. kivy/lib/__init__.py +21 -0
  417. kivy/lib/ddsfile.py +419 -0
  418. kivy/lib/gstplayer/__init__.py +27 -0
  419. kivy/lib/mtdev.py +254 -0
  420. kivy/lib/vidcore_lite/__init__.py +0 -0
  421. kivy/loader.py +579 -0
  422. kivy/logger.py +646 -0
  423. kivy/metrics.py +421 -0
  424. kivy/modules/__init__.py +300 -0
  425. kivy/modules/_webdebugger.py +200 -0
  426. kivy/modules/console.py +1059 -0
  427. kivy/modules/cursor.py +75 -0
  428. kivy/modules/inspector.py +755 -0
  429. kivy/modules/joycursor.py +299 -0
  430. kivy/modules/keybinding.py +64 -0
  431. kivy/modules/monitor.py +90 -0
  432. kivy/modules/recorder.py +94 -0
  433. kivy/modules/screen.py +183 -0
  434. kivy/modules/showborder.py +33 -0
  435. kivy/modules/touchring.py +97 -0
  436. kivy/modules/webdebugger.py +30 -0
  437. kivy/multistroke.py +1477 -0
  438. kivy/network/__init__.py +7 -0
  439. kivy/network/urlrequest.py +794 -0
  440. kivy/parser.py +154 -0
  441. kivy/resources.py +102 -0
  442. kivy/storage/__init__.py +405 -0
  443. kivy/storage/dictstore.py +98 -0
  444. kivy/storage/jsonstore.py +92 -0
  445. kivy/storage/redisstore.py +103 -0
  446. kivy/support.py +267 -0
  447. kivy/tests/__init__.py +11 -0
  448. kivy/tests/async_common.py +568 -0
  449. kivy/tests/common.py +524 -0
  450. kivy/tests/conftest.py +33 -0
  451. kivy/tests/fixtures.py +169 -0
  452. kivy/tests/perf_test_textinput.py +195 -0
  453. kivy/tests/pyinstaller/simple_widget/main.py +12 -0
  454. kivy/tests/pyinstaller/simple_widget/project/__init__.py +0 -0
  455. kivy/tests/pyinstaller/simple_widget/project/widget.py +12 -0
  456. kivy/tests/pyinstaller/test_pyinstaller.py +115 -0
  457. kivy/tests/pyinstaller/video_widget/main.py +6 -0
  458. kivy/tests/pyinstaller/video_widget/project/__init__.py +38 -0
  459. kivy/tests/test_animations.py +415 -0
  460. kivy/tests/test_app.py +216 -0
  461. kivy/tests/test_audio.py +69 -0
  462. kivy/tests/test_benchmark.py +292 -0
  463. kivy/tests/test_clipboard.py +48 -0
  464. kivy/tests/test_clock.py +292 -0
  465. kivy/tests/test_compat.py +6 -0
  466. kivy/tests/test_config.py +35 -0
  467. kivy/tests/test_coverage.py +83 -0
  468. kivy/tests/test_doc_gallery.py +38 -0
  469. kivy/tests/test_environ_cli.py +50 -0
  470. kivy/tests/test_fbo_py2py3.py +74 -0
  471. kivy/tests/test_filechooser.py +11 -0
  472. kivy/tests/test_filechooser_unicode.py +82 -0
  473. kivy/tests/test_fonts.py +42 -0
  474. kivy/tests/test_garden.py +23 -0
  475. kivy/tests/test_graphics.py +1149 -0
  476. kivy/tests/test_graphics_svg.py +84 -0
  477. kivy/tests/test_image.py +74 -0
  478. kivy/tests/test_imageloader.py +485 -0
  479. kivy/tests/test_invalid_lang.py +42 -0
  480. kivy/tests/test_issues/test_6315.py +55 -0
  481. kivy/tests/test_issues/test_issue_1084.py +47 -0
  482. kivy/tests/test_issues/test_issue_1091.py +19 -0
  483. kivy/tests/test_issues/test_issue_599.py +21 -0
  484. kivy/tests/test_issues/test_issue_609.py +19 -0
  485. kivy/tests/test_issues/test_issue_6909.py +28 -0
  486. kivy/tests/test_issues/test_issue_883.py +12 -0
  487. kivy/tests/test_kivy_init.py +30 -0
  488. kivy/tests/test_knspace.py +247 -0
  489. kivy/tests/test_lang.py +431 -0
  490. kivy/tests/test_lang_complex.py +87 -0
  491. kivy/tests/test_lang_pre_process_and_post_process.py +394 -0
  492. kivy/tests/test_logger.py +516 -0
  493. kivy/tests/test_metrics.py +30 -0
  494. kivy/tests/test_module_inspector.py +382 -0
  495. kivy/tests/test_motion_event.py +44 -0
  496. kivy/tests/test_mouse_hover_event.py +249 -0
  497. kivy/tests/test_mouse_multitouchsim.py +554 -0
  498. kivy/tests/test_multistroke.py +389 -0
  499. kivy/tests/test_properties.py +1332 -0
  500. kivy/tests/test_resources.py +79 -0
  501. kivy/tests/test_rst_replace.py +63 -0
  502. kivy/tests/test_screen.py +38 -0
  503. kivy/tests/test_storage.py +135 -0
  504. kivy/tests/test_uix_actionbar.py +363 -0
  505. kivy/tests/test_uix_anchorlayout.py +79 -0
  506. kivy/tests/test_uix_asyncimage.py +133 -0
  507. kivy/tests/test_uix_boxlayout.py +94 -0
  508. kivy/tests/test_uix_bubble.py +425 -0
  509. kivy/tests/test_uix_carousel.py +93 -0
  510. kivy/tests/test_uix_colorpicker.py +77 -0
  511. kivy/tests/test_uix_dropdown.py +91 -0
  512. kivy/tests/test_uix_gridlayout.py +244 -0
  513. kivy/tests/test_uix_layout.py +16 -0
  514. kivy/tests/test_uix_modal.py +101 -0
  515. kivy/tests/test_uix_recyclegridlayout.py +383 -0
  516. kivy/tests/test_uix_relativelayout.py +30 -0
  517. kivy/tests/test_uix_scrollview.py +358 -0
  518. kivy/tests/test_uix_settings.py +33 -0
  519. kivy/tests/test_uix_slider.py +156 -0
  520. kivy/tests/test_uix_stacklayout.py +120 -0
  521. kivy/tests/test_uix_textinput.py +577 -0
  522. kivy/tests/test_uix_translate_coordinates.py +72 -0
  523. kivy/tests/test_uix_videoplayer.py +112 -0
  524. kivy/tests/test_uix_widget.py +137 -0
  525. kivy/tests/test_urlrequest/test_urlrequest_requests.py +378 -0
  526. kivy/tests/test_urlrequest/test_urlrequest_urllib.py +155 -0
  527. kivy/tests/test_utils.py +237 -0
  528. kivy/tests/test_vector.py +256 -0
  529. kivy/tests/test_video.py +25 -0
  530. kivy/tests/test_weakmethod.py +44 -0
  531. kivy/tests/test_widget.py +127 -0
  532. kivy/tests/test_widget_walk.py +70 -0
  533. kivy/tests/test_window_base.py +60 -0
  534. kivy/tests/test_window_info.py +29 -0
  535. kivy/tests/visual_test_label.py +291 -0
  536. kivy/tools/__init__.py +44 -0
  537. kivy/tools/benchmark.py +286 -0
  538. kivy/tools/changelog_parser.py +120 -0
  539. kivy/tools/coverage.py +135 -0
  540. kivy/tools/gallery.py +323 -0
  541. kivy/tools/generate-icons.py +117 -0
  542. kivy/tools/gles_compat/subset_gles.py +125 -0
  543. kivy/tools/highlight/__init__.py +9 -0
  544. kivy/tools/kviewer.py +80 -0
  545. kivy/tools/packaging/__init__.py +12 -0
  546. kivy/tools/packaging/cython_cfg.py +82 -0
  547. kivy/tools/packaging/factory.py +105 -0
  548. kivy/tools/packaging/pyinstaller_hooks/__init__.py +381 -0
  549. kivy/tools/packaging/pyinstaller_hooks/__main__.py +29 -0
  550. kivy/tools/packaging/pyinstaller_hooks/hook-kivy.py +9 -0
  551. kivy/tools/packaging/pyinstaller_hooks/pyi_rth_kivy.py +17 -0
  552. kivy/tools/pep8checker/pep8.py +2316 -0
  553. kivy/tools/pep8checker/pep8kivy.py +109 -0
  554. kivy/tools/report.py +223 -0
  555. kivy/tools/stub-gl-debug.py +201 -0
  556. kivy/tools/texturecompress.py +233 -0
  557. kivy/uix/__init__.py +56 -0
  558. kivy/uix/accordion.py +484 -0
  559. kivy/uix/actionbar.py +934 -0
  560. kivy/uix/anchorlayout.py +122 -0
  561. kivy/uix/behaviors/__init__.py +95 -0
  562. kivy/uix/behaviors/button.py +212 -0
  563. kivy/uix/behaviors/codenavigation.py +167 -0
  564. kivy/uix/behaviors/compoundselection.py +688 -0
  565. kivy/uix/behaviors/cover.py +160 -0
  566. kivy/uix/behaviors/drag.py +234 -0
  567. kivy/uix/behaviors/emacs.py +140 -0
  568. kivy/uix/behaviors/focus.py +595 -0
  569. kivy/uix/behaviors/knspace.py +590 -0
  570. kivy/uix/behaviors/togglebutton.py +156 -0
  571. kivy/uix/behaviors/touchripple.py +318 -0
  572. kivy/uix/boxlayout.py +331 -0
  573. kivy/uix/bubble.py +576 -0
  574. kivy/uix/button.py +137 -0
  575. kivy/uix/camera.py +118 -0
  576. kivy/uix/carousel.py +695 -0
  577. kivy/uix/checkbox.py +197 -0
  578. kivy/uix/codeinput.py +238 -0
  579. kivy/uix/colorpicker.py +486 -0
  580. kivy/uix/dropdown.py +391 -0
  581. kivy/uix/effectwidget.py +772 -0
  582. kivy/uix/filechooser.py +1134 -0
  583. kivy/uix/floatlayout.py +148 -0
  584. kivy/uix/gesturesurface.py +625 -0
  585. kivy/uix/gridlayout.py +629 -0
  586. kivy/uix/image.py +528 -0
  587. kivy/uix/label.py +1200 -0
  588. kivy/uix/layout.py +322 -0
  589. kivy/uix/modalview.py +339 -0
  590. kivy/uix/pagelayout.py +233 -0
  591. kivy/uix/popup.py +266 -0
  592. kivy/uix/progressbar.py +95 -0
  593. kivy/uix/recycleboxlayout.py +183 -0
  594. kivy/uix/recyclegridlayout.py +255 -0
  595. kivy/uix/recyclelayout.py +446 -0
  596. kivy/uix/recycleview/__init__.py +624 -0
  597. kivy/uix/recycleview/datamodel.py +194 -0
  598. kivy/uix/recycleview/layout.py +253 -0
  599. kivy/uix/recycleview/views.py +423 -0
  600. kivy/uix/relativelayout.py +324 -0
  601. kivy/uix/rst.py +1492 -0
  602. kivy/uix/sandbox.py +198 -0
  603. kivy/uix/scatter.py +645 -0
  604. kivy/uix/scatterlayout.py +93 -0
  605. kivy/uix/screenmanager.py +1275 -0
  606. kivy/uix/scrollview.py +1288 -0
  607. kivy/uix/settings.py +1343 -0
  608. kivy/uix/slider.py +421 -0
  609. kivy/uix/spinner.py +221 -0
  610. kivy/uix/splitter.py +430 -0
  611. kivy/uix/stacklayout.py +331 -0
  612. kivy/uix/stencilview.py +40 -0
  613. kivy/uix/switch.py +122 -0
  614. kivy/uix/tabbedpanel.py +880 -0
  615. kivy/uix/textinput.py +4049 -0
  616. kivy/uix/togglebutton.py +37 -0
  617. kivy/uix/treeview.py +665 -0
  618. kivy/uix/video.py +302 -0
  619. kivy/uix/videoplayer.py +697 -0
  620. kivy/uix/vkeyboard.py +879 -0
  621. kivy/uix/widget.py +1629 -0
  622. kivy/utils.py +550 -0
  623. kivy/vector.py +412 -0
  624. kivy/weakmethod.py +72 -0
@@ -0,0 +1,1332 @@
1
+ '''
2
+ Test properties attached to a widget
3
+ '''
4
+
5
+ import unittest
6
+ import pytest
7
+ from kivy.event import EventDispatcher
8
+ from functools import partial
9
+
10
+
11
+ class _TestProperty(EventDispatcher):
12
+ pass
13
+
14
+
15
+ wid = _TestProperty()
16
+
17
+
18
+ @pytest.fixture(autouse=True)
19
+ def set_clock(kivy_clock):
20
+ pass
21
+
22
+
23
+ @pytest.fixture()
24
+ def self():
25
+ return unittest.TestCase()
26
+
27
+
28
+ @pytest.mark.parametrize('set_name', [True, False])
29
+ def test_base(self, set_name):
30
+ from kivy.properties import Property
31
+
32
+ a = Property(-1)
33
+ if set_name:
34
+ a.set_name(wid, 'a')
35
+ a.link_eagerly(wid)
36
+ else:
37
+ a.link(wid, 'a')
38
+ a.link_deps(wid, 'a')
39
+ self.assertEqual(a.get(wid), -1)
40
+ a.set(wid, 0)
41
+ self.assertEqual(a.get(wid), 0)
42
+ a.set(wid, 1)
43
+ self.assertEqual(a.get(wid), 1)
44
+
45
+
46
+ @pytest.mark.parametrize('set_name', [True, False])
47
+ def test_observer(self, set_name):
48
+ from kivy.properties import Property
49
+
50
+ a = Property(-1)
51
+ if set_name:
52
+ a.set_name(wid, 'a')
53
+ a.link_eagerly(wid)
54
+ else:
55
+ a.link(wid, 'a')
56
+ a.link_deps(wid, 'a')
57
+ self.assertEqual(a.get(wid), -1)
58
+ global observe_called
59
+ observe_called = 0
60
+
61
+ def observe(obj, value):
62
+ global observe_called
63
+ observe_called = 1
64
+ a.bind(wid, observe)
65
+
66
+ a.set(wid, 0)
67
+ self.assertEqual(a.get(wid), 0)
68
+ self.assertEqual(observe_called, 1)
69
+ observe_called = 0
70
+ a.set(wid, 0)
71
+ self.assertEqual(a.get(wid), 0)
72
+ self.assertEqual(observe_called, 0)
73
+ a.set(wid, 1)
74
+ self.assertEqual(a.get(wid), 1)
75
+ self.assertEqual(observe_called, 1)
76
+
77
+
78
+ @pytest.mark.parametrize('set_name', [True, False])
79
+ def test_objectcheck(self, set_name):
80
+ from kivy.properties import ObjectProperty
81
+
82
+ a = ObjectProperty(False)
83
+ if set_name:
84
+ a.set_name(wid, 'a')
85
+ a.link_eagerly(wid)
86
+ else:
87
+ a.link(wid, 'a')
88
+ a.link_deps(wid, 'a')
89
+ self.assertEqual(a.get(wid), False)
90
+ a.set(wid, True)
91
+ self.assertEqual(a.get(wid), True)
92
+
93
+
94
+ @pytest.mark.parametrize('set_name', [True, False])
95
+ def test_stringcheck(self, set_name):
96
+ from kivy.properties import StringProperty
97
+
98
+ a = StringProperty()
99
+ if set_name:
100
+ a.set_name(wid, 'a')
101
+ a.link_eagerly(wid)
102
+ else:
103
+ a.link(wid, 'a')
104
+ a.link_deps(wid, 'a')
105
+ self.assertEqual(a.get(wid), '')
106
+ a.set(wid, 'hello')
107
+ self.assertEqual(a.get(wid), 'hello')
108
+
109
+ try:
110
+ a.set(wid, 88) # number shouldn't be accepted
111
+ self.fail('string accept number, fail.')
112
+ except ValueError:
113
+ pass
114
+
115
+
116
+ @pytest.mark.parametrize('set_name', [True, False])
117
+ def test_numericcheck(self, set_name):
118
+ from kivy.properties import NumericProperty
119
+
120
+ a = NumericProperty()
121
+ if set_name:
122
+ a.set_name(wid, 'a')
123
+ a.link_eagerly(wid)
124
+ else:
125
+ a.link(wid, 'a')
126
+ a.link_deps(wid, 'a')
127
+ self.assertEqual(a.get(wid), 0)
128
+ a.set(wid, 99)
129
+ self.assertEqual(a.get(wid), 99)
130
+
131
+ # try:
132
+ # a.set(wid, '') # string shouldn't be accepted
133
+ # self.fail('number accept string, fail.')
134
+ # except ValueError:
135
+ # pass
136
+
137
+
138
+ @pytest.mark.parametrize('set_name', [True, False])
139
+ def test_listcheck(self, set_name):
140
+ from kivy.properties import ListProperty
141
+
142
+ a = ListProperty()
143
+ if set_name:
144
+ a.set_name(wid, 'a')
145
+ a.link_eagerly(wid)
146
+ else:
147
+ a.link(wid, 'a')
148
+ a.link_deps(wid, 'a')
149
+ self.assertEqual(a.get(wid), [])
150
+ a.set(wid, [1, 2, 3])
151
+ self.assertEqual(a.get(wid), [1, 2, 3])
152
+
153
+
154
+ @pytest.mark.parametrize('set_name', [True, False])
155
+ def test_dictcheck(self, set_name):
156
+ from kivy.properties import DictProperty
157
+
158
+ a = DictProperty()
159
+ if set_name:
160
+ a.set_name(wid, 'a')
161
+ a.link_eagerly(wid)
162
+ else:
163
+ a.link(wid, 'a')
164
+ a.link_deps(wid, 'a')
165
+ self.assertEqual(a.get(wid), {})
166
+ a.set(wid, {'foo': 'bar'})
167
+ self.assertEqual(a.get(wid), {'foo': 'bar'})
168
+
169
+
170
+ @pytest.mark.parametrize('set_name', [True, False])
171
+ def test_propertynone(self, set_name):
172
+ from kivy.properties import NumericProperty
173
+
174
+ a = NumericProperty(0, allownone=True)
175
+ if set_name:
176
+ a.set_name(wid, 'a')
177
+ a.link_eagerly(wid)
178
+ else:
179
+ a.link(wid, 'a')
180
+ a.link_deps(wid, 'a')
181
+ self.assertEqual(a.get(wid), 0)
182
+ try:
183
+ a.set(wid, None)
184
+ self.assertEqual(a.get(wid), None)
185
+ except ValueError:
186
+ pass
187
+ a.set(wid, 1)
188
+ self.assertEqual(a.get(wid), 1)
189
+
190
+
191
+ @pytest.mark.parametrize('set_name', [True, False])
192
+ def test_reference(self, set_name):
193
+ from kivy.properties import NumericProperty, ReferenceListProperty
194
+
195
+ x = NumericProperty(0)
196
+ if set_name:
197
+ x.set_name(wid, 'x')
198
+ x.link_eagerly(wid)
199
+ else:
200
+ x.link(wid, 'x')
201
+ x.link_deps(wid, 'x')
202
+ y = NumericProperty(0)
203
+ if set_name:
204
+ y.set_name(wid, 'y')
205
+ y.link_eagerly(wid)
206
+ else:
207
+ y.link(wid, 'y')
208
+ y.link_deps(wid, 'y')
209
+ pos = ReferenceListProperty(x, y)
210
+ if set_name:
211
+ pos.set_name(wid, 'pos')
212
+ pos.link_eagerly(wid)
213
+ else:
214
+ pos.link(wid, 'pos')
215
+ pos.link_deps(wid, 'pos')
216
+
217
+ self.assertEqual(x.get(wid), 0)
218
+ self.assertEqual(y.get(wid), 0)
219
+ self.assertEqual(pos.get(wid), [0, 0])
220
+
221
+ x.set(wid, 50)
222
+ self.assertEqual(pos.get(wid), [50, 0])
223
+
224
+ y.set(wid, 50)
225
+ self.assertEqual(pos.get(wid), [50, 50])
226
+
227
+ pos.set(wid, [0, 0])
228
+ self.assertEqual(pos.get(wid), [0, 0])
229
+ self.assertEqual(x.get(wid), 0)
230
+ self.assertEqual(y.get(wid), 0)
231
+
232
+ # test observer
233
+ global observe_called
234
+ observe_called = 0
235
+
236
+ def observe(obj, value):
237
+ global observe_called
238
+ observe_called = 1
239
+ pos.bind(wid, observe)
240
+
241
+ self.assertEqual(observe_called, 0)
242
+ x.set(wid, 99)
243
+ self.assertEqual(observe_called, 1)
244
+
245
+
246
+ @pytest.mark.parametrize('set_name', [True, False])
247
+ def test_reference_child_update(self, set_name):
248
+ from kivy.properties import NumericProperty, ReferenceListProperty
249
+
250
+ x = NumericProperty(0)
251
+ if set_name:
252
+ x.set_name(wid, 'x')
253
+ x.link_eagerly(wid)
254
+ else:
255
+ x.link(wid, 'x')
256
+ x.link_deps(wid, 'x')
257
+ y = NumericProperty(0)
258
+ if set_name:
259
+ y.set_name(wid, 'y')
260
+ y.link_eagerly(wid)
261
+ else:
262
+ y.link(wid, 'y')
263
+ y.link_deps(wid, 'y')
264
+ pos = ReferenceListProperty(x, y)
265
+ if set_name:
266
+ pos.set_name(wid, 'pos')
267
+ pos.link_eagerly(wid)
268
+ else:
269
+ pos.link(wid, 'pos')
270
+ pos.link_deps(wid, 'pos')
271
+
272
+ pos.get(wid)[0] = 10
273
+ self.assertEqual(pos.get(wid), [10, 0])
274
+
275
+ pos.get(wid)[:] = (20, 30)
276
+ self.assertEqual(pos.get(wid), [20, 30])
277
+
278
+
279
+ @pytest.mark.parametrize('set_name', [True, False])
280
+ def test_dict(self, set_name):
281
+ from kivy.properties import DictProperty
282
+
283
+ x = DictProperty()
284
+ if set_name:
285
+ x.set_name(wid, 'x')
286
+ x.link_eagerly(wid)
287
+ else:
288
+ x.link(wid, 'x')
289
+ x.link_deps(wid, 'x')
290
+
291
+ # test observer
292
+ global observe_called
293
+ observe_called = 0
294
+
295
+ def observe(obj, value):
296
+ global observe_called
297
+ observe_called = 1
298
+
299
+ x.bind(wid, observe)
300
+
301
+ observe_called = 0
302
+ x.get(wid)['toto'] = 1
303
+ self.assertEqual(observe_called, 1)
304
+
305
+ observe_called = 0
306
+ x.get(wid)['toto'] = 2
307
+ self.assertEqual(observe_called, 1)
308
+
309
+ observe_called = 0
310
+ x.get(wid)['youupi'] = 2
311
+ self.assertEqual(observe_called, 1)
312
+
313
+ observe_called = 0
314
+ del x.get(wid)['toto']
315
+ self.assertEqual(observe_called, 1)
316
+
317
+ observe_called = 0
318
+ x.get(wid).update({'bleh': 5})
319
+ self.assertEqual(observe_called, 1)
320
+
321
+
322
+ @pytest.mark.parametrize('set_name', [True, False])
323
+ def test_bounded_numeric_property(self, set_name):
324
+ from kivy.properties import BoundedNumericProperty
325
+
326
+ bnp = BoundedNumericProperty(0.0, min=0.0, max=3.5)
327
+
328
+ if set_name:
329
+ bnp.set_name(wid, 'bnp')
330
+ bnp.link_eagerly(wid)
331
+ else:
332
+ bnp.link(wid, 'bnp')
333
+ bnp.link_deps(wid, 'bnp')
334
+
335
+ bnp.set(wid, 1)
336
+ bnp.set(wid, 0.0)
337
+ bnp.set(wid, 3.1)
338
+ bnp.set(wid, 3.5)
339
+ self.assertRaises(ValueError, partial(bnp.set, wid, 3.6))
340
+ self.assertRaises(ValueError, partial(bnp.set, wid, -3))
341
+
342
+
343
+ @pytest.mark.parametrize('set_name', [True, False])
344
+ def test_bounded_numeric_property_error_value(self, set_name):
345
+ from kivy.properties import BoundedNumericProperty
346
+
347
+ bnp = BoundedNumericProperty(0, min=-5, max=5, errorvalue=1)
348
+ if set_name:
349
+ bnp.set_name(wid, 'bnp')
350
+ bnp.link_eagerly(wid)
351
+ else:
352
+ bnp.link(wid, 'bnp')
353
+ bnp.link_deps(wid, 'bnp')
354
+
355
+ bnp.set(wid, 1)
356
+ self.assertEqual(bnp.get(wid), 1)
357
+
358
+ bnp.set(wid, 5)
359
+ self.assertEqual(bnp.get(wid), 5)
360
+
361
+ bnp.set(wid, 6)
362
+ self.assertEqual(bnp.get(wid), 1)
363
+
364
+ bnp.set(wid, -5)
365
+ self.assertEqual(bnp.get(wid), -5)
366
+
367
+ bnp.set(wid, -6)
368
+ self.assertEqual(bnp.get(wid), 1)
369
+
370
+
371
+ @pytest.mark.parametrize('set_name', [True, False])
372
+ def test_bounded_numeric_property_error_handler(self, set_name):
373
+ from kivy.properties import BoundedNumericProperty
374
+
375
+ bnp = BoundedNumericProperty(
376
+ 0, min=-5, max=5,
377
+ errorhandler=lambda x: 5 if x > 5 else -5)
378
+
379
+ if set_name:
380
+ bnp.set_name(wid, 'bnp')
381
+ bnp.link_eagerly(wid)
382
+ else:
383
+ bnp.link(wid, 'bnp')
384
+ bnp.link_deps(wid, 'bnp')
385
+
386
+ bnp.set(wid, 1)
387
+ self.assertEqual(bnp.get(wid), 1)
388
+
389
+ bnp.set(wid, 5)
390
+ self.assertEqual(bnp.get(wid), 5)
391
+
392
+ bnp.set(wid, 10)
393
+ self.assertEqual(bnp.get(wid), 5)
394
+
395
+ bnp.set(wid, -5)
396
+ self.assertEqual(bnp.get(wid), -5)
397
+
398
+ bnp.set(wid, -10)
399
+ self.assertEqual(bnp.get(wid), -5)
400
+
401
+
402
+ @pytest.mark.parametrize('set_name', [True, False])
403
+ def test_numeric_string_with_units_check(self, set_name):
404
+ from kivy.properties import NumericProperty
405
+ from kivy.metrics import Metrics
406
+
407
+ a = NumericProperty()
408
+ if set_name:
409
+ a.set_name(wid, 'a')
410
+ a.link_eagerly(wid)
411
+ else:
412
+ a.link(wid, 'a')
413
+ a.link_deps(wid, 'a')
414
+ self.assertEqual(a.get(wid), 0)
415
+
416
+ a.set(wid, '55dp')
417
+ density = Metrics.density
418
+ self.assertEqual(a.get(wid), 55 * density)
419
+ self.assertEqual(a.get_format(wid), 'dp')
420
+
421
+ a.set(wid, u'55dp')
422
+ self.assertEqual(a.get(wid), 55 * density)
423
+ self.assertEqual(a.get_format(wid), 'dp')
424
+
425
+ a.set(wid, '99in')
426
+ self.assertEqual(a.get(wid), 9504.0 * density)
427
+ self.assertEqual(a.get_format(wid), 'in')
428
+
429
+ a.set(wid, u'99in')
430
+ self.assertEqual(a.get(wid), 9504.0 * density)
431
+ self.assertEqual(a.get_format(wid), 'in')
432
+
433
+
434
+ @pytest.mark.parametrize('set_name', [True, False])
435
+ def test_numeric_string_without_units(self, set_name):
436
+ from kivy.properties import NumericProperty
437
+
438
+ a = NumericProperty()
439
+ if set_name:
440
+ a.set_name(wid, 'a')
441
+ a.link_eagerly(wid)
442
+ else:
443
+ a.link(wid, 'a')
444
+ a.link_deps(wid, 'a')
445
+ self.assertEqual(a.get(wid), 0)
446
+
447
+ a.set(wid, '2')
448
+ self.assertEqual(a.get(wid), 2)
449
+
450
+
451
+ def test_property_rebind(self):
452
+ from kivy.uix.label import Label
453
+ from kivy.uix.togglebutton import ToggleButton
454
+ from kivy.lang import Builder
455
+ from kivy.properties import ObjectProperty, DictProperty, AliasProperty
456
+ from kivy.clock import Clock
457
+
458
+ class ObjWidget(Label):
459
+ button = ObjectProperty(None, rebind=True, allownone=True)
460
+
461
+ class ObjWidgetRebindFalse(Label):
462
+ button = ObjectProperty(None, rebind=False, allownone=True)
463
+
464
+ class DictWidget(Label):
465
+ button = DictProperty({'button': None}, rebind=True,
466
+ allownone=True)
467
+
468
+ class DictWidgetFalse(Label):
469
+ button = DictProperty({'button': None}, rebind=False)
470
+
471
+ class AliasWidget(Label):
472
+ _button = None
473
+
474
+ def setter(self, value):
475
+ self._button = value
476
+ return True
477
+
478
+ def getter(self):
479
+ return self._button
480
+ button = AliasProperty(getter, setter, rebind=True)
481
+
482
+ Builder.load_string('''
483
+ <ObjWidget>:
484
+ text: self.button.state if self.button is not None else 'Unset'
485
+
486
+ <ObjWidgetRebindFalse>:
487
+ text: self.button.state if self.button is not None else 'Unset'
488
+
489
+ <AliasWidget>:
490
+ text: self.button.state if self.button is not None else 'Unset'
491
+
492
+ <DictWidget>:
493
+ text: self.button.button.state if self.button.button is not None\
494
+ else 'Unset'
495
+
496
+ <DictWidgetFalse>:
497
+ text: self.button.button.state if self.button.button is not None\
498
+ else 'Unset'
499
+ ''')
500
+
501
+ obj = ObjWidget()
502
+ obj_false = ObjWidgetRebindFalse()
503
+ dict_rebind = DictWidget()
504
+ dict_false = DictWidgetFalse()
505
+ alias_rebind = AliasWidget()
506
+ button = ToggleButton()
507
+ Clock.tick()
508
+ self.assertEqual(obj.text, 'Unset')
509
+ self.assertEqual(obj_false.text, 'Unset')
510
+ self.assertEqual(dict_rebind.text, 'Unset')
511
+ self.assertEqual(dict_false.text, 'Unset')
512
+ self.assertEqual(alias_rebind.text, 'Unset')
513
+
514
+ obj.button = button
515
+ obj_false.button = button
516
+ dict_rebind.button.button = button
517
+ dict_false.button.button = button
518
+ alias_rebind.button = button
519
+ Clock.tick()
520
+ self.assertEqual(obj.text, 'normal')
521
+ self.assertEqual(obj_false.text, 'normal')
522
+ self.assertEqual(dict_rebind.text, 'normal')
523
+ self.assertEqual(dict_false.text, 'Unset')
524
+ self.assertEqual(alias_rebind.text, 'normal')
525
+
526
+ button.state = 'down'
527
+ Clock.tick()
528
+ self.assertEqual(obj.text, 'down')
529
+ self.assertEqual(obj_false.text, 'normal')
530
+ self.assertEqual(dict_rebind.text, 'down')
531
+ self.assertEqual(dict_false.text, 'Unset')
532
+ self.assertEqual(alias_rebind.text, 'down')
533
+
534
+ button.state = 'normal'
535
+ Clock.tick()
536
+ self.assertEqual(obj.text, 'normal')
537
+ self.assertEqual(obj_false.text, 'normal')
538
+ self.assertEqual(dict_rebind.text, 'normal')
539
+ self.assertEqual(dict_false.text, 'Unset')
540
+ self.assertEqual(alias_rebind.text, 'normal')
541
+
542
+ obj.button = None
543
+ obj_false.button = None
544
+ dict_rebind.button.button = None
545
+ dict_false.button.button = None
546
+ alias_rebind.button = None
547
+ Clock.tick()
548
+ self.assertEqual(obj.text, 'Unset')
549
+ self.assertEqual(obj_false.text, 'Unset')
550
+ self.assertEqual(dict_rebind.text, 'Unset')
551
+ self.assertEqual(dict_false.text, 'Unset')
552
+ self.assertEqual(alias_rebind.text, 'Unset')
553
+
554
+
555
+ @pytest.mark.parametrize('set_name', [True, False])
556
+ def test_color_property(self, set_name):
557
+ from kivy.properties import ColorProperty
558
+
559
+ color = ColorProperty()
560
+ if set_name:
561
+ color.set_name(wid, 'color')
562
+ color.link_eagerly(wid)
563
+ else:
564
+ color.link(wid, 'color')
565
+ color.link_deps(wid, 'color')
566
+ self.assertEqual(color.get(wid), [1, 1, 1, 1])
567
+
568
+ color2 = ColorProperty()
569
+ if set_name:
570
+ color2.set_name(wid, 'color2')
571
+ color2.link_eagerly(wid)
572
+ else:
573
+ color2.link(wid, 'color2')
574
+ color2.link_deps(wid, 'color2')
575
+ self.assertEqual(color2.get(wid), [1, 1, 1, 1])
576
+
577
+ color.set(wid, 'yellow')
578
+ self.assertEqual(color.get(wid), [1.0, 1.0, 0.0, 1.0])
579
+
580
+ color.set(wid, "#00ff00")
581
+ self.assertEqual(color.get(wid), [0, 1, 0, 1])
582
+
583
+ color.set(wid, "#7f7fff7f")
584
+ self.assertEqual(color.get(wid)[0], 127 / 255.)
585
+ self.assertEqual(color.get(wid)[1], 127 / 255.)
586
+ self.assertEqual(color.get(wid)[2], 1)
587
+ self.assertEqual(color.get(wid)[3], 127 / 255.)
588
+
589
+ color.set(wid, (1, 1, 0))
590
+ self.assertEqual(color.get(wid), [1, 1, 0, 1])
591
+ color.set(wid, (1, 1, 0, 0))
592
+ self.assertEqual(color.get(wid), [1, 1, 0, 0])
593
+
594
+ color.set(wid, [1, 1, 1, 1])
595
+ color_value = color.get(wid)
596
+ color_value[0] = 0.5
597
+ self.assertEqual(color.get(wid), [0.5, 1, 1, 1])
598
+
599
+ self.assertEqual(color2.get(wid), [1, 1, 1, 1])
600
+ color2.set(wid, color.get(wid))
601
+ self.assertEqual(color2.get(wid), [0.5, 1, 1, 1])
602
+
603
+ color.set(wid, [1, 1, 1, 1])
604
+ color_value = color.get(wid)
605
+ color_value[:] = [0, 1, 0, 1]
606
+ self.assertEqual(color.get(wid), [0, 1, 0, 1])
607
+
608
+
609
+ @pytest.mark.parametrize('watch_before_use', [True, False])
610
+ def test_alias_property_without_setter(self, watch_before_use):
611
+ from kivy.properties import AliasProperty
612
+
613
+ expected_value = 5
614
+
615
+ class CustomAlias(EventDispatcher):
616
+
617
+ def _get_prop(self):
618
+ self.getter_called += 1
619
+ return expected_value
620
+
621
+ prop = AliasProperty(_get_prop, None, watch_before_use=watch_before_use)
622
+
623
+ def __init__(self, **kwargs):
624
+ super(CustomAlias, self).__init__(**kwargs)
625
+ self.getter_called = 0
626
+
627
+ # Initial checks
628
+ wid = CustomAlias()
629
+ self.assertEqual(wid.getter_called, 0)
630
+
631
+ # Get value, should call getter once
632
+ value = wid.prop
633
+ self.assertEqual(value, expected_value)
634
+ self.assertEqual(wid.getter_called, 1)
635
+
636
+ # Setter should raise an AttributeError
637
+ self.assertRaises(AttributeError, partial(setattr, wid, 'prop', 1))
638
+
639
+
640
+ @pytest.mark.parametrize('watch_before_use', [True, False])
641
+ def test_alias_property(self, watch_before_use):
642
+ from kivy.properties import AliasProperty
643
+
644
+ class CustomAlias(EventDispatcher):
645
+
646
+ def _get_prop(self):
647
+ self.getter_called += 1
648
+
649
+ def _set_prop(self, value):
650
+ self.setter_called += 1
651
+
652
+ prop = AliasProperty(
653
+ _get_prop, _set_prop, watch_before_use=watch_before_use)
654
+
655
+ def __init__(self, **kwargs):
656
+ super(CustomAlias, self).__init__(**kwargs)
657
+ self.getter_called = 0
658
+ self.setter_called = 0
659
+ self.callback_called = 0
660
+
661
+ def callback(widget, value):
662
+ widget.callback_called += 1
663
+
664
+ # Initial checks
665
+ wid = CustomAlias()
666
+ wid.bind(prop=callback)
667
+ self.assertEqual(wid.getter_called, 0)
668
+ self.assertEqual(wid.setter_called, 0)
669
+ self.assertEqual(wid.callback_called, 0)
670
+
671
+ # Set property, should call setter to set the value
672
+ # Getter and callback should not be called because `_set_prop` doesn't
673
+ # returns True
674
+ wid.prop = 1
675
+ self.assertEqual(wid.getter_called, 0)
676
+ self.assertEqual(wid.setter_called, 1)
677
+ self.assertEqual(wid.callback_called, 0)
678
+
679
+ # Set property to same value as before, should only call setter
680
+ wid.prop = 1
681
+ self.assertEqual(wid.getter_called, 0)
682
+ self.assertEqual(wid.setter_called, 2)
683
+ self.assertEqual(wid.callback_called, 0)
684
+
685
+ # Get value of the property, should call getter once
686
+ self.assertEqual(wid.prop, None)
687
+ self.assertEqual(wid.getter_called, 1)
688
+ self.assertEqual(wid.setter_called, 2)
689
+ self.assertEqual(wid.callback_called, 0)
690
+
691
+
692
+ @pytest.mark.parametrize('watch_before_use', [True, False])
693
+ def test_alias_property_cache_true(self, watch_before_use):
694
+ from kivy.properties import AliasProperty
695
+
696
+ expected_value = 5
697
+
698
+ class CustomAlias(EventDispatcher):
699
+
700
+ def _get_prop(self):
701
+ self.getter_called += 1
702
+ return expected_value
703
+
704
+ def _set_prop(self, value):
705
+ self.setter_called += 1
706
+ return True
707
+
708
+ prop = AliasProperty(
709
+ _get_prop, _set_prop, cache=True, watch_before_use=watch_before_use)
710
+
711
+ def __init__(self, **kwargs):
712
+ super(CustomAlias, self).__init__(**kwargs)
713
+ self.getter_called = 0
714
+ self.setter_called = 0
715
+
716
+ # Initial checks
717
+ wid = CustomAlias()
718
+ self.assertEqual(wid.getter_called, 0)
719
+ self.assertEqual(wid.setter_called, 0)
720
+
721
+ # Get value of the property, should call getter once
722
+ value = wid.prop
723
+ self.assertEqual(value, expected_value)
724
+ self.assertEqual(wid.getter_called, 1)
725
+ self.assertEqual(wid.setter_called, 0)
726
+
727
+ # Get value of the property, should return cached value
728
+ # Getter should not be called
729
+ value = wid.prop
730
+ self.assertEqual(value, expected_value)
731
+ self.assertEqual(wid.getter_called, 1)
732
+ self.assertEqual(wid.setter_called, 0)
733
+
734
+ # Set value of property, should call getter and setter
735
+ wid.prop = 10
736
+ value = wid.prop
737
+ self.assertEqual(value, expected_value)
738
+ self.assertEqual(wid.setter_called, 1)
739
+ self.assertEqual(wid.getter_called, 2)
740
+
741
+
742
+ @pytest.mark.parametrize('watch_before_use', [True, False])
743
+ def test_alias_property_with_bind(self, watch_before_use):
744
+ from kivy.properties import NumericProperty, AliasProperty
745
+
746
+ class CustomAlias(EventDispatcher):
747
+
748
+ x = NumericProperty(0)
749
+ width = NumericProperty(100)
750
+
751
+ def get_right(self):
752
+ return self.x + self.width
753
+
754
+ def set_right(self, value):
755
+ self.x = value - self.width
756
+
757
+ right = AliasProperty(
758
+ get_right, set_right, bind=('x', 'width'),
759
+ watch_before_use=watch_before_use)
760
+
761
+ def __init__(self, **kwargs):
762
+ super(CustomAlias, self).__init__(**kwargs)
763
+ self.callback_called = 0
764
+
765
+ # Assert values when setting x, width or right properties
766
+ wid = CustomAlias()
767
+ self.assertEqual(wid.right, 100)
768
+ wid.x = 500
769
+ self.assertEqual(wid.right, 600)
770
+ wid.width = 50
771
+ self.assertEqual(wid.right, 550)
772
+ wid.right = 100
773
+ self.assertEqual(wid.width, 50)
774
+ self.assertEqual(wid.x, 50)
775
+
776
+ def callback(widget, value):
777
+ widget.callback_called += 1
778
+
779
+ wid.bind(right=callback)
780
+
781
+ # Callback should be called only when property changes
782
+ wid.x = 100
783
+ self.assertEqual(wid.callback_called, 1)
784
+ wid.x = 100
785
+ self.assertEqual(wid.callback_called, 1)
786
+ wid.width = 900
787
+ self.assertEqual(wid.callback_called, 2)
788
+ wid.right = 700
789
+ self.assertEqual(wid.callback_called, 3)
790
+ wid.right = 700
791
+ self.assertEqual(wid.callback_called, 3)
792
+
793
+
794
+ @pytest.mark.parametrize('watch_before_use', [True, False])
795
+ def test_alias_property_with_force_dispatch_true(self, watch_before_use):
796
+ from kivy.properties import AliasProperty
797
+
798
+ class CustomAlias(EventDispatcher):
799
+
800
+ def _get_prop(self):
801
+ self.getter_called += 1
802
+
803
+ def _set_prop(self, value):
804
+ self.setter_called += 1
805
+
806
+ prop = AliasProperty(
807
+ _get_prop, _set_prop, force_dispatch=True,
808
+ watch_before_use=watch_before_use)
809
+
810
+ def __init__(self, **kwargs):
811
+ super(CustomAlias, self).__init__(**kwargs)
812
+ self.getter_called = 0
813
+ self.setter_called = 0
814
+ self.callback_called = 0
815
+
816
+ def callback(widget, value):
817
+ widget.callback_called += 1
818
+
819
+ # Initial checks
820
+ wid = CustomAlias()
821
+ wid.bind(prop=callback)
822
+ self.assertEqual(wid.getter_called, 0)
823
+ self.assertEqual(wid.setter_called, 0)
824
+ self.assertEqual(wid.callback_called, 0)
825
+
826
+ # Set property, should call setter to set the value and getter to
827
+ # to get the value for dispatch call
828
+ wid.prop = 1
829
+ self.assertEqual(wid.getter_called, 1)
830
+ self.assertEqual(wid.setter_called, 1)
831
+ self.assertEqual(wid.callback_called, 1)
832
+
833
+ # Set property to same value as before, setter and getter and callback
834
+ # are called
835
+ wid.prop = 1
836
+ self.assertEqual(wid.getter_called, 2)
837
+ self.assertEqual(wid.setter_called, 2)
838
+ self.assertEqual(wid.callback_called, 2)
839
+
840
+
841
+ @pytest.mark.parametrize('watch_before_use', [True, False])
842
+ def test_alias_property_cache_true_with_bind(self, watch_before_use):
843
+ from kivy.properties import NumericProperty, AliasProperty
844
+
845
+ class CustomAlias(EventDispatcher):
846
+
847
+ base_value = NumericProperty(1)
848
+
849
+ def _get_prop(self):
850
+ self.getter_called += 1
851
+ return self.base_value * 2
852
+
853
+ def _set_prop(self, value):
854
+ self.base_value = value / 2
855
+
856
+ prop = AliasProperty(_get_prop, _set_prop,
857
+ bind=('base_value',),
858
+ cache=True, watch_before_use=watch_before_use)
859
+
860
+ def __init__(self, **kwargs):
861
+ super(CustomAlias, self).__init__(**kwargs)
862
+ self.getter_called = 0
863
+
864
+ # Initial checks
865
+ wid = CustomAlias()
866
+ self.assertEqual(wid.getter_called, 0)
867
+ self.assertEqual(wid.base_value, 1)
868
+ self.assertEqual(wid.getter_called, 0)
869
+
870
+ # Change the base value, should trigger an update for the cache
871
+ wid.base_value = 4
872
+ self.assertEqual(wid.getter_called, int(watch_before_use))
873
+
874
+ # Now read the value again, should use the cache
875
+ self.assertEqual(wid.prop, 8)
876
+ self.assertEqual(wid.getter_called, 1)
877
+
878
+ # Change the prop itself, should trigger an update for the cache
879
+ wid.prop = 4
880
+ self.assertEqual(wid.getter_called, 2)
881
+ self.assertEqual(wid.base_value, 2)
882
+ self.assertEqual(wid.prop, 4)
883
+ self.assertEqual(wid.getter_called, 2)
884
+
885
+
886
+ @pytest.mark.parametrize('watch_before_use', [True, False])
887
+ def test_alias_property_cache_true_force_dispatch_true(self, watch_before_use):
888
+ from kivy.properties import AliasProperty
889
+
890
+ class CustomAlias(EventDispatcher):
891
+
892
+ def _get_prop(self):
893
+ self.getter_called += 1
894
+ return self.base_value * 2
895
+
896
+ def _set_prop(self, value):
897
+ self.setter_called += 1
898
+ self.base_value = value / 2
899
+ return True
900
+
901
+ prop = AliasProperty(
902
+ _get_prop, _set_prop, cache=True, force_dispatch=True,
903
+ watch_before_use=watch_before_use)
904
+
905
+ def __init__(self, **kwargs):
906
+ super(CustomAlias, self).__init__(**kwargs)
907
+ self.base_value = 1
908
+ self.getter_called = 0
909
+ self.setter_called = 0
910
+ self.callback_called = 0
911
+
912
+ def callback(widget, value):
913
+ widget.callback_called += 1
914
+
915
+ wid = CustomAlias()
916
+ wid.bind(prop=callback)
917
+
918
+ # Initial checks
919
+ self.assertEqual(wid.base_value, 1)
920
+ self.assertEqual(wid.getter_called, 0)
921
+ self.assertEqual(wid.setter_called, 0)
922
+ self.assertEqual(wid.callback_called, 0)
923
+
924
+ # Set alias property some value, should call setter and then getter to
925
+ # pass the value to callback
926
+ wid.prop = 16
927
+ self.assertEqual(wid.base_value, 8)
928
+ self.assertEqual(wid.getter_called, 1)
929
+ self.assertEqual(wid.setter_called, 1)
930
+ self.assertEqual(wid.callback_called, 1)
931
+
932
+ # Same as the step above, should call setter, getter and callback
933
+ wid.prop = 16
934
+ self.assertEqual(wid.base_value, 8)
935
+ self.assertEqual(wid.getter_called, 2)
936
+ self.assertEqual(wid.setter_called, 2)
937
+ self.assertEqual(wid.callback_called, 2)
938
+
939
+ # Get the value of property, should use cached value
940
+ value = wid.prop
941
+ self.assertEqual(value, 16)
942
+ self.assertEqual(wid.getter_called, 2)
943
+ self.assertEqual(wid.setter_called, 2)
944
+ self.assertEqual(wid.callback_called, 2)
945
+
946
+
947
+ def test_dictproperty_is_none():
948
+ from kivy.properties import DictProperty
949
+
950
+ d1 = DictProperty(None)
951
+ d1.set_name(wid, 'd1')
952
+ d1.link_eagerly(wid)
953
+ assert d1.get(wid) is None
954
+
955
+ d2 = DictProperty({'a': 1, 'b': 2}, allownone=True)
956
+ d2.set_name(wid, 'd2')
957
+ d2.link_eagerly(wid)
958
+ d2.set(wid, None)
959
+ assert d2.get(wid) is None
960
+
961
+
962
+ def test_listproperty_is_none():
963
+ from kivy.properties import ListProperty
964
+
965
+ l1 = ListProperty(None)
966
+ l1.set_name(wid, 'l1')
967
+ l1.link_eagerly(wid)
968
+ assert l1.get(wid) is None
969
+
970
+ l2 = ListProperty([1, 2, 3], allownone=True)
971
+ l2.set_name(wid, 'l2')
972
+ l2.link_eagerly(wid)
973
+ l2.set(wid, None)
974
+ assert l2.get(wid) is None
975
+
976
+
977
+ def test_numeric_property_dp(kivy_metrics):
978
+ from kivy.event import EventDispatcher
979
+ from kivy.properties import NumericProperty
980
+ kivy_metrics.density = 1
981
+
982
+ class Number(EventDispatcher):
983
+
984
+ with_dp = NumericProperty(5)
985
+
986
+ no_dp = NumericProperty(10)
987
+
988
+ default_dp = NumericProperty('10dp')
989
+
990
+ number = Number()
991
+ counter = {'with_dp': 0, 'no_dp': 0, 'default_dp': 0}
992
+
993
+ def callback(name, *args):
994
+ counter[name] += 1
995
+
996
+ number.fbind('with_dp', callback, 'with_dp')
997
+ number.fbind('no_dp', callback, 'no_dp')
998
+ number.fbind('default_dp', callback, 'default_dp')
999
+
1000
+ assert not counter['with_dp']
1001
+ assert not counter['no_dp']
1002
+ assert not counter['default_dp']
1003
+ assert number.with_dp == 5
1004
+ assert number.no_dp == 10
1005
+ assert number.default_dp == 10
1006
+
1007
+ number.with_dp = 10
1008
+ assert counter['with_dp'] == 1
1009
+ assert number.with_dp == 10
1010
+
1011
+ kivy_metrics.density = 2
1012
+
1013
+ assert counter['with_dp'] == 1
1014
+ assert not counter['no_dp']
1015
+ assert counter['default_dp'] == 1
1016
+ assert number.with_dp == 10
1017
+ assert number.no_dp == 10
1018
+ assert number.default_dp == 20
1019
+
1020
+ number.with_dp = '20dp'
1021
+ number.no_dp = 20
1022
+
1023
+ assert counter['with_dp'] == 2
1024
+ assert counter['no_dp'] == 1
1025
+ assert counter['default_dp'] == 1
1026
+ assert number.with_dp == 40
1027
+ assert number.no_dp == 20
1028
+ assert number.default_dp == 20
1029
+
1030
+ kivy_metrics.density = 1
1031
+
1032
+ assert counter['with_dp'] == 3
1033
+ assert counter['no_dp'] == 1
1034
+ assert counter['default_dp'] == 2
1035
+ assert number.with_dp == 20
1036
+ assert number.no_dp == 20
1037
+ assert number.default_dp == 10
1038
+
1039
+
1040
+ def test_variable_list_property_dp_default(kivy_metrics):
1041
+ from kivy.event import EventDispatcher
1042
+ from kivy.properties import VariableListProperty
1043
+ kivy_metrics.density = 1
1044
+
1045
+ class Number(EventDispatcher):
1046
+
1047
+ a = VariableListProperty(['10dp', (20, 'dp'), 3, 4.0])
1048
+
1049
+ number = Number()
1050
+ counter = 0
1051
+
1052
+ def callback(name, *args):
1053
+ nonlocal counter
1054
+ counter += 1
1055
+
1056
+ number.fbind('a', callback)
1057
+ assert list(number.a) == [10, 20, 3, 4]
1058
+ assert not counter
1059
+
1060
+ kivy_metrics.density = 2
1061
+
1062
+ assert counter == 1
1063
+ assert list(number.a) == [20, 40, 3, 4]
1064
+
1065
+ kivy_metrics.density = 1
1066
+
1067
+ assert counter == 2
1068
+ assert list(number.a) == [10, 20, 3, 4]
1069
+
1070
+
1071
+ def test_variable_list_property_dp(kivy_metrics):
1072
+ from kivy.event import EventDispatcher
1073
+ from kivy.properties import VariableListProperty
1074
+ kivy_metrics.density = 1
1075
+
1076
+ class Number(EventDispatcher):
1077
+
1078
+ a = VariableListProperty([0, 20, 3, 4])
1079
+
1080
+ number = Number()
1081
+ counter = 0
1082
+
1083
+ def callback(name, *args):
1084
+ nonlocal counter
1085
+ counter += 1
1086
+
1087
+ number.fbind('a', callback)
1088
+ assert list(number.a) == [0, 20, 3, 4]
1089
+ assert not counter
1090
+
1091
+ number.a = ['10dp', (20, 'dp'), 3, 4.0]
1092
+ assert list(number.a) == [10, 20, 3, 4]
1093
+ assert counter == 1
1094
+
1095
+ kivy_metrics.density = 2
1096
+
1097
+ assert counter == 2
1098
+ assert list(number.a) == [20, 40, 3, 4]
1099
+
1100
+ kivy_metrics.density = 1
1101
+
1102
+ assert counter == 3
1103
+ assert list(number.a) == [10, 20, 3, 4]
1104
+
1105
+
1106
+ def test_property_duplicate_name():
1107
+ from kivy.event import EventDispatcher
1108
+ from kivy.properties import ObjectProperty
1109
+
1110
+ class Event(EventDispatcher):
1111
+
1112
+ a = ObjectProperty(5)
1113
+
1114
+ event = Event()
1115
+ counter = 0
1116
+ counter2 = 0
1117
+
1118
+ def callback(*args):
1119
+ nonlocal counter
1120
+ counter += 1
1121
+
1122
+ def callback2(*args):
1123
+ nonlocal counter2
1124
+ counter2 += 1
1125
+
1126
+ event.fbind('a', callback)
1127
+
1128
+ event.create_property('a', None)
1129
+ event.fbind('a', callback2)
1130
+
1131
+ event.a = 12
1132
+ assert not counter
1133
+ assert counter2 == 1
1134
+
1135
+
1136
+ def test_property_rename_duplicate():
1137
+ from kivy.event import EventDispatcher
1138
+ from kivy.properties import ObjectProperty
1139
+
1140
+ class Event(EventDispatcher):
1141
+
1142
+ b = ObjectProperty(5)
1143
+ a = b
1144
+
1145
+ event = Event()
1146
+ counter = 0
1147
+ counter2 = 0
1148
+
1149
+ def callback(*args):
1150
+ nonlocal counter
1151
+ counter += 1
1152
+
1153
+ def callback2(*args):
1154
+ nonlocal counter2
1155
+ counter2 += 1
1156
+
1157
+ event.fbind('a', callback)
1158
+ event.fbind('b', callback2)
1159
+
1160
+ event.a = 12
1161
+ assert counter == 1
1162
+ assert counter2 == 1
1163
+ assert event.a == 12
1164
+ assert event.b == 12
1165
+
1166
+ event.b = 14
1167
+ assert counter == 2
1168
+ assert counter2 == 2
1169
+ assert event.a == 14
1170
+ assert event.b == 14
1171
+
1172
+
1173
+ def test_override_prop_inheritance():
1174
+ from kivy.event import EventDispatcher
1175
+ from kivy.properties import ObjectProperty, AliasProperty
1176
+ counter = 0
1177
+
1178
+ class Parent(EventDispatcher):
1179
+
1180
+ prop = ObjectProperty()
1181
+
1182
+ class Child(Parent):
1183
+
1184
+ def inc(self, *args):
1185
+ nonlocal counter
1186
+ counter += 1
1187
+ return counter
1188
+
1189
+ prop = AliasProperty(inc)
1190
+
1191
+ parent = Parent()
1192
+ child = Child()
1193
+
1194
+ parent.prop = 44
1195
+ assert parent.prop == 44
1196
+ assert counter == 0
1197
+ assert child.prop == 1
1198
+ assert counter == 1
1199
+ assert parent.prop == 44
1200
+ assert isinstance(parent.property('prop'), ObjectProperty)
1201
+ assert isinstance(child.property('prop'), AliasProperty)
1202
+
1203
+
1204
+ @pytest.mark.parametrize('by_val', [True, False])
1205
+ def test_manually_create_property(by_val):
1206
+ from kivy.event import EventDispatcher
1207
+ from kivy.properties import StringProperty
1208
+
1209
+ class Event(EventDispatcher):
1210
+ pass
1211
+
1212
+ event = Event()
1213
+ assert not hasattr(event, 'a')
1214
+ if by_val:
1215
+ event.create_property('a', 'hello')
1216
+ else:
1217
+ event.apply_property(a=StringProperty('hello'))
1218
+ args = 0
1219
+
1220
+ def callback(obj, val):
1221
+ nonlocal args
1222
+ args = obj, val
1223
+
1224
+ event.fbind('a', callback)
1225
+ assert event.a == 'hello'
1226
+ event.a = 'bye'
1227
+ assert event.a == 'bye'
1228
+ assert args == (event, 'bye')
1229
+
1230
+ event2 = Event()
1231
+ assert event2.a == 'hello'
1232
+ event2.fbind('a', callback)
1233
+ event2.a = 'goodbye'
1234
+ assert event2.a == 'goodbye'
1235
+ assert args == (event2, 'goodbye')
1236
+
1237
+
1238
+ def test_inherit_property():
1239
+ from kivy.event import EventDispatcher
1240
+ from kivy.properties import StringProperty
1241
+
1242
+ class Event(EventDispatcher):
1243
+
1244
+ a = StringProperty('hello')
1245
+
1246
+ class Event2(Event):
1247
+
1248
+ b = StringProperty('hello2')
1249
+
1250
+ event = Event2()
1251
+ args = 0
1252
+
1253
+ def callback(obj, val):
1254
+ nonlocal args
1255
+ args = obj, val
1256
+
1257
+ event.fbind('a', callback)
1258
+ event.fbind('b', callback)
1259
+ assert event.a == 'hello'
1260
+ assert event.b == 'hello2'
1261
+
1262
+ event.a = 'bye'
1263
+ assert event.a == 'bye'
1264
+ assert args == (event, 'bye')
1265
+
1266
+ event.b = 'goodbye'
1267
+ assert event.b == 'goodbye'
1268
+ assert args == (event, 'goodbye')
1269
+
1270
+
1271
+ def test_unknown_property():
1272
+ from kivy.properties import NumericProperty
1273
+
1274
+ class MyWidget(EventDispatcher):
1275
+ width = NumericProperty(0)
1276
+
1277
+ with pytest.raises(TypeError) as cm:
1278
+ MyWidget(width=12, unkn="abc")
1279
+ assert "Properties ['unkn'] passed to __init__ may not be existing " \
1280
+ "property names. Valid properties are ['width']" \
1281
+ == str(cm.value)
1282
+
1283
+
1284
+ def test_known_property_multiple_inheritance():
1285
+
1286
+ class Behavior:
1287
+ def __init__(self, name):
1288
+ print(f'Behavior: {self}, name={name}')
1289
+ super().__init__()
1290
+
1291
+ class Widget2(Behavior, EventDispatcher):
1292
+ pass
1293
+
1294
+ class Widget3(EventDispatcher, Behavior):
1295
+ pass
1296
+
1297
+ with pytest.raises(TypeError) as cm:
1298
+ EventDispatcher(name='Pasta')
1299
+ assert "Properties ['name'] passed to __init__ may not be existing" \
1300
+ in str(cm.value)
1301
+
1302
+ Widget2(name='Pasta') # does not raise a ValueError
1303
+ Widget3(name='Pasta') # does not raise a ValueError
1304
+
1305
+
1306
+ def test_pass_other_typeerror():
1307
+
1308
+ class Behavior:
1309
+ def __init__(self, name):
1310
+ super().__init__()
1311
+ raise TypeError("this is a typeerror unrelated to object")
1312
+
1313
+ class Widget2(Behavior, EventDispatcher):
1314
+ pass
1315
+
1316
+ class Widget3(EventDispatcher, Behavior):
1317
+ pass
1318
+
1319
+ for cls in [Widget2, Widget3]:
1320
+ with pytest.raises(TypeError) as cm:
1321
+ cls(name='Pasta')
1322
+ assert "this is a typeerror unrelated to object" == str(cm.value)
1323
+
1324
+
1325
+ def test_object_init_error(): # the above 3 test rely on this
1326
+ class TestCls(object):
1327
+ def __init__(self, **kwargs):
1328
+ super(TestCls, self).__init__(**kwargs)
1329
+
1330
+ with pytest.raises(TypeError) as cm:
1331
+ TestCls(name='foo')
1332
+ assert str(cm.value).startswith("object.__init__() takes")