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
kivy/lang/parser.py ADDED
@@ -0,0 +1,822 @@
1
+ '''
2
+ Parser
3
+ ======
4
+
5
+ Class used for the parsing of .kv files into rules.
6
+ '''
7
+ import os
8
+
9
+ import re
10
+ import sys
11
+ import traceback
12
+ import ast
13
+ import importlib
14
+ from re import sub, findall
15
+ from types import CodeType
16
+ from functools import partial
17
+ from collections import OrderedDict, defaultdict
18
+
19
+ import kivy.lang.builder # imported as absolute to avoid circular import
20
+ from kivy.logger import Logger
21
+ from kivy.cache import Cache
22
+ from kivy import require
23
+ from kivy.resources import resource_find
24
+ from kivy.utils import rgba
25
+ import kivy.metrics as Metrics
26
+
27
+ __all__ = ('Parser', 'ParserException')
28
+
29
+
30
+ trace = Logger.trace
31
+ global_idmap = {}
32
+
33
+ # register cache for creating new classtype (template)
34
+ Cache.register('kv.lang')
35
+
36
+ # all previously included files
37
+ __KV_INCLUDES__ = []
38
+
39
+ # precompile regexp expression
40
+ str_re = (
41
+ "(?:'''.*?''')|"
42
+ "(?:(?:(?<!')|''')'(?:[^']|\\\\')+?'(?:(?!')|'''))|"
43
+ '(?:""".*?""")|'
44
+ '(?:(?:(?<!")|""")"(?:[^"]|\\\\")+?"(?:(?!")|"""))'
45
+ )
46
+
47
+ lang_str = re.compile(f"({str_re})", re.DOTALL)
48
+ lang_fstr = re.compile(f"([fF](?:{str_re}))", re.DOTALL)
49
+
50
+ lang_key = re.compile('([a-zA-Z_]+)')
51
+ lang_keyvalue = re.compile(r'([a-zA-Z_][a-zA-Z0-9_.]*\.[a-zA-Z0-9_.]+)')
52
+ lang_tr = re.compile(r'(_\()')
53
+ lang_cls_split_pat = re.compile(', *')
54
+
55
+ # all the widget handlers, used to correctly unbind all the callbacks then the
56
+ # widget is deleted
57
+ _handlers = defaultdict(partial(defaultdict, list))
58
+
59
+
60
+ class ProxyApp(object):
61
+ # proxy app object
62
+ # taken from http://code.activestate.com/recipes/496741-object-proxying/
63
+
64
+ __slots__ = ['_obj']
65
+
66
+ def __init__(self):
67
+ object.__init__(self)
68
+ object.__setattr__(self, '_obj', None)
69
+
70
+ def _ensure_app(self):
71
+ app = object.__getattribute__(self, '_obj')
72
+ if app is None:
73
+ from kivy.app import App
74
+ app = App.get_running_app()
75
+ object.__setattr__(self, '_obj', app)
76
+ # Clear cached application instance, when it stops
77
+ app.bind(on_stop=lambda instance:
78
+ object.__setattr__(self, '_obj', None))
79
+ return app
80
+
81
+ def __getattribute__(self, name):
82
+ object.__getattribute__(self, '_ensure_app')()
83
+ return getattr(object.__getattribute__(self, '_obj'), name)
84
+
85
+ def __delattr__(self, name):
86
+ object.__getattribute__(self, '_ensure_app')()
87
+ delattr(object.__getattribute__(self, '_obj'), name)
88
+
89
+ def __setattr__(self, name, value):
90
+ object.__getattribute__(self, '_ensure_app')()
91
+ setattr(object.__getattribute__(self, '_obj'), name, value)
92
+
93
+ def __bool__(self):
94
+ object.__getattribute__(self, '_ensure_app')()
95
+ return bool(object.__getattribute__(self, '_obj'))
96
+
97
+ def __str__(self):
98
+ object.__getattribute__(self, '_ensure_app')()
99
+ return str(object.__getattribute__(self, '_obj'))
100
+
101
+ def __repr__(self):
102
+ object.__getattribute__(self, '_ensure_app')()
103
+ return repr(object.__getattribute__(self, '_obj'))
104
+
105
+
106
+ global_idmap['app'] = ProxyApp()
107
+ global_idmap['pt'] = Metrics.pt
108
+ global_idmap['inch'] = Metrics.inch
109
+ global_idmap['cm'] = Metrics.cm
110
+ global_idmap['mm'] = Metrics.mm
111
+ global_idmap['dp'] = Metrics.dp
112
+ global_idmap['sp'] = Metrics.sp
113
+ global_idmap['rgba'] = rgba
114
+
115
+
116
+ class ParserException(Exception):
117
+ '''Exception raised when something wrong happened in a kv file.
118
+ '''
119
+
120
+ def __init__(self, context, line, message, cause=None):
121
+ self.filename = context.filename or '<inline>'
122
+ self.line = line
123
+ sourcecode = context.sourcecode
124
+ sc_start = max(0, line - 2)
125
+ sc_stop = min(len(sourcecode), line + 3)
126
+ sc = ['...']
127
+ for x in range(sc_start, sc_stop):
128
+ if x == line:
129
+ sc += ['>> %4d:%s' % (line + 1, sourcecode[line][1])]
130
+ else:
131
+ sc += [' %4d:%s' % (x + 1, sourcecode[x][1])]
132
+ sc += ['...']
133
+ sc = '\n'.join(sc)
134
+
135
+ message = 'Parser: File "%s", line %d:\n%s\n%s' % (
136
+ self.filename, self.line + 1, sc, message)
137
+ if cause:
138
+ message += '\n' + ''.join(traceback.format_tb(cause))
139
+
140
+ super(ParserException, self).__init__(message)
141
+
142
+
143
+ class ParserRuleProperty(object):
144
+ '''Represent a property inside a rule.
145
+ '''
146
+
147
+ __slots__ = ('ctx', 'line', 'name', 'value', 'co_value',
148
+ 'watched_keys', 'mode', 'count', 'ignore_prev')
149
+
150
+ def __init__(self, ctx, line, name, value, ignore_prev=False):
151
+ super(ParserRuleProperty, self).__init__()
152
+ #: Associated parser
153
+ self.ctx = ctx
154
+ #: Line of the rule
155
+ self.line = line
156
+ #: Name of the property
157
+ self.name = name
158
+ #: Value of the property
159
+ self.value = value
160
+ #: Compiled value
161
+ self.co_value = None
162
+ #: Compilation mode
163
+ self.mode = None
164
+ #: Watched keys
165
+ self.watched_keys = None
166
+ #: Stats
167
+ self.count = 0
168
+ #: whether previous rules targeting name should be cleared
169
+ self.ignore_prev = ignore_prev
170
+
171
+ def precompile(self):
172
+ name = self.name
173
+ value = self.value
174
+
175
+ # first, remove all the string from the value
176
+ tmp = sub(lang_str, '', self.value)
177
+
178
+ # detecting how to handle the value according to the key name
179
+ mode = self.mode
180
+ if self.mode is None:
181
+ self.mode = mode = 'exec' if name[:3] == 'on_' else 'eval'
182
+ if mode == 'eval':
183
+ # if we don't detect any string/key in it, we can eval and give the
184
+ # result
185
+ if re.search(lang_key, tmp) is None:
186
+ value = '\n' * self.line + value
187
+ self.co_value = eval(
188
+ compile(value, self.ctx.filename or '<string>', 'eval')
189
+ )
190
+ return
191
+
192
+ # ok, we can compile.
193
+ value = '\n' * self.line + value
194
+ self.co_value = compile(value, self.ctx.filename or '<string>', mode)
195
+
196
+ # for exec mode, we don't need to watch any keys.
197
+ if mode == 'exec':
198
+ return
199
+
200
+ # now, detect obj.prop
201
+ # find all the fstrings in the value
202
+ fstrings = lang_fstr.findall(value)
203
+ wk = set()
204
+ for s in fstrings:
205
+ expression = ast.parse(s)
206
+ wk |= set(self.get_names_from_expression(expression.body[0].value))
207
+
208
+ # first, remove all the string from the value
209
+ tmp = sub(lang_str, '', value)
210
+ idx = tmp.find('#')
211
+ if idx != -1:
212
+ tmp = tmp[:idx]
213
+ # detect key.value inside value, and split them
214
+ wk |= set(findall(lang_keyvalue, tmp))
215
+ if wk:
216
+ self.watched_keys = [x.split('.') for x in wk]
217
+ if findall(lang_tr, tmp):
218
+ if self.watched_keys:
219
+ self.watched_keys += [['_']]
220
+ else:
221
+ self.watched_keys = [['_']]
222
+
223
+ @classmethod
224
+ def get_names_from_expression(cls, node):
225
+ """
226
+ Look for all the symbols used in an ast node.
227
+ """
228
+ if isinstance(node, ast.Name):
229
+ yield node.id
230
+
231
+ if isinstance(node, (ast.JoinedStr, ast.BoolOp)):
232
+ for n in node.values:
233
+ if isinstance(n, ast.Str):
234
+ # NOTE: required for python3.6
235
+ yield from cls.get_names_from_expression(n.s)
236
+ else:
237
+ yield from cls.get_names_from_expression(n.value)
238
+
239
+ if isinstance(node, ast.BinOp):
240
+ yield from cls.get_names_from_expression(node.right)
241
+ yield from cls.get_names_from_expression(node.left)
242
+
243
+ if isinstance(node, ast.IfExp):
244
+ yield from cls.get_names_from_expression(node.test)
245
+ yield from cls.get_names_from_expression(node.body)
246
+ yield from cls.get_names_from_expression(node.orelse)
247
+
248
+ if isinstance(node, ast.Subscript):
249
+ yield from cls.get_names_from_expression(node.value)
250
+ yield from cls.get_names_from_expression(node.slice)
251
+
252
+ if isinstance(node, ast.Slice):
253
+ yield from cls.get_names_from_expression(node.lower)
254
+ yield from cls.get_names_from_expression(node.upper)
255
+ yield from cls.get_names_from_expression(node.step)
256
+
257
+ if isinstance(
258
+ node,
259
+ (ast.ListComp, ast.DictComp, ast.SetComp, ast.GeneratorExp)
260
+ ):
261
+ for g in node.generators:
262
+ yield from cls.get_names_from_expression(g.iter)
263
+
264
+ if isinstance(node, (ast.List, ast.Tuple, ast.Set)):
265
+ for elt in node.elts:
266
+ yield from cls.get_names_from_expression(elt)
267
+
268
+ if isinstance(node, ast.Dict):
269
+ for val in node.values:
270
+ yield from cls.get_names_from_expression(val)
271
+
272
+ if isinstance(node, ast.UnaryOp):
273
+ yield from cls.get_names_from_expression(node.operand)
274
+
275
+ if isinstance(node, ast.comprehension):
276
+ yield from cls.get_names_from_expression(node.iter.value)
277
+
278
+ if isinstance(node, ast.Attribute):
279
+ if isinstance(node.value, ast.Name):
280
+ yield f'{node.value.id}.{node.attr}'
281
+
282
+ if isinstance(node, ast.Call):
283
+ yield from cls.get_names_from_expression(node.func)
284
+
285
+ for arg in node.args:
286
+ yield from cls.get_names_from_expression(arg)
287
+ for keyword in node.keywords:
288
+ yield from cls.get_names_from_expression(keyword.value)
289
+
290
+ def __repr__(self):
291
+ return '<ParserRuleProperty name=%r filename=%s:%d ' \
292
+ 'value=%r watched_keys=%r>' % (
293
+ self.name, self.ctx.filename, self.line + 1,
294
+ self.value, self.watched_keys)
295
+
296
+
297
+ class ParserRule(object):
298
+ '''Represents a rule, in terms of the Kivy internal language.
299
+ '''
300
+
301
+ __slots__ = ('ctx', 'line', 'name', 'children', 'id', 'properties',
302
+ 'canvas_before', 'canvas_root', 'canvas_after',
303
+ 'handlers', 'level', 'cache_marked', 'avoid_previous_rules')
304
+
305
+ def __init__(self, ctx, line, name, level):
306
+ super(ParserRule, self).__init__()
307
+ #: Level of the rule in the kv
308
+ self.level = level
309
+ #: Associated parser
310
+ self.ctx = ctx
311
+ #: Line of the rule
312
+ self.line = line
313
+ #: Name of the rule
314
+ self.name = name
315
+ #: List of children to create
316
+ self.children = []
317
+ #: Id given to the rule
318
+ self.id = None
319
+ #: Properties associated to the rule
320
+ self.properties = OrderedDict()
321
+ #: Canvas normal
322
+ self.canvas_root = None
323
+ #: Canvas before
324
+ self.canvas_before = None
325
+ #: Canvas after
326
+ self.canvas_after = None
327
+ #: Handlers associated to the rule
328
+ self.handlers = []
329
+ #: Properties cache list: mark which class have already been checked
330
+ self.cache_marked = []
331
+ #: Indicate if any previous rules should be avoided.
332
+ self.avoid_previous_rules = False
333
+
334
+ if level == 0:
335
+ self._detect_selectors()
336
+ else:
337
+ self._forbid_selectors()
338
+
339
+ def precompile(self):
340
+ for x in self.properties.values():
341
+ x.precompile()
342
+ for x in self.handlers:
343
+ x.precompile()
344
+ for x in self.children:
345
+ x.precompile()
346
+ if self.canvas_before:
347
+ self.canvas_before.precompile()
348
+ if self.canvas_root:
349
+ self.canvas_root.precompile()
350
+ if self.canvas_after:
351
+ self.canvas_after.precompile()
352
+
353
+ def create_missing(self, widget):
354
+ # check first if the widget class already been processed by this rule
355
+ cls = widget.__class__
356
+ if cls in self.cache_marked:
357
+ return
358
+ self.cache_marked.append(cls)
359
+ for name in self.properties:
360
+ if hasattr(widget, name):
361
+ continue
362
+ value = self.properties[name].co_value
363
+ if type(value) is CodeType:
364
+ value = None
365
+ widget.create_property(name, value, default_value=False)
366
+
367
+ def _forbid_selectors(self):
368
+ c = self.name[0]
369
+ if c == '<' or c == '[':
370
+ raise ParserException(
371
+ self.ctx, self.line,
372
+ 'Selectors rules are allowed only at the first level')
373
+
374
+ def _detect_selectors(self):
375
+ c = self.name[0]
376
+ if c == '<':
377
+ self._build_rule()
378
+ elif c == '[':
379
+ self._build_template()
380
+ else:
381
+ if self.ctx.root is not None:
382
+ raise ParserException(
383
+ self.ctx, self.line,
384
+ 'Only one root object is allowed by .kv')
385
+ self.ctx.root = self
386
+
387
+ def _build_rule(self):
388
+ name = self.name
389
+ if __debug__:
390
+ trace('Builder: build rule for %s' % name)
391
+ if name[0] != '<' or name[-1] != '>':
392
+ raise ParserException(self.ctx, self.line,
393
+ 'Invalid rule (must be inside <>)')
394
+
395
+ # if the very first name start with a -, avoid previous rules
396
+ name = name[1:-1]
397
+ if name[:1] == '-':
398
+ self.avoid_previous_rules = True
399
+ name = name[1:]
400
+
401
+ for rule in re.split(lang_cls_split_pat, name):
402
+ crule = None
403
+
404
+ if not rule:
405
+ raise ParserException(self.ctx, self.line,
406
+ 'Empty rule detected')
407
+
408
+ if '@' in rule:
409
+ # new class creation ?
410
+ # ensure the name is correctly written
411
+ rule, baseclasses = rule.split('@', 1)
412
+ if not re.match(lang_key, rule):
413
+ raise ParserException(self.ctx, self.line,
414
+ 'Invalid dynamic class name')
415
+
416
+ # save the name in the dynamic classes dict.
417
+ self.ctx.dynamic_classes[rule] = baseclasses
418
+ crule = ParserSelectorName(rule)
419
+
420
+ else:
421
+ # classical selectors.
422
+
423
+ if rule[0] == '.':
424
+ crule = ParserSelectorClass(rule[1:])
425
+ else:
426
+ crule = ParserSelectorName(rule)
427
+
428
+ self.ctx.rules.append((crule, self))
429
+
430
+ def _build_template(self):
431
+ name = self.name
432
+ exception = ParserException(
433
+ self.ctx, self.line,
434
+ 'Deprecated Kivy lang template syntax used "{}". Templates will '
435
+ 'be removed in a future version'.format(name))
436
+ if name not in ('[FileListEntry@FloatLayout+TreeViewNode]',
437
+ '[FileIconEntry@Widget]',
438
+ '[AccordionItemTitle@Label]'):
439
+ Logger.warning(exception)
440
+
441
+ if __debug__:
442
+ trace('Builder: build template for %s' % name)
443
+ if name[0] != '[' or name[-1] != ']':
444
+ raise ParserException(self.ctx, self.line,
445
+ 'Invalid template (must be inside [])')
446
+ item_content = name[1:-1]
447
+ if '@' not in item_content:
448
+ raise ParserException(self.ctx, self.line,
449
+ 'Invalid template name (missing @)')
450
+ template_name, template_root_cls = item_content.split('@')
451
+ self.ctx.templates.append((template_name, template_root_cls, self))
452
+
453
+ def __repr__(self):
454
+ return '<ParserRule name=%r>' % (self.name, )
455
+
456
+
457
+ class Parser(object):
458
+ '''Create a Parser object to parse a Kivy language file or Kivy content.
459
+ '''
460
+
461
+ PROP_ALLOWED = ('canvas.before', 'canvas.after')
462
+ CLASS_RANGE = list(range(ord('A'), ord('Z') + 1))
463
+ PROP_RANGE = (
464
+ list(range(ord('A'), ord('Z') + 1)) +
465
+ list(range(ord('a'), ord('z') + 1)) +
466
+ list(range(ord('0'), ord('9') + 1)) + [ord('_')])
467
+
468
+ __slots__ = ('rules', 'templates', 'root', 'sourcecode',
469
+ 'directives', 'filename', 'dynamic_classes')
470
+
471
+ def __init__(self, **kwargs):
472
+ super(Parser, self).__init__()
473
+ self.rules = []
474
+ self.templates = []
475
+ self.root = None
476
+ self.sourcecode = []
477
+ self.directives = []
478
+ self.dynamic_classes = {}
479
+ self.filename = kwargs.get('filename', None)
480
+ content = kwargs.get('content', None)
481
+ if content is None:
482
+ raise ValueError('No content passed')
483
+ self.parse(content)
484
+
485
+ def execute_directives(self):
486
+ global __KV_INCLUDES__
487
+ for ln, cmd in self.directives:
488
+ cmd = cmd.strip()
489
+ if __debug__:
490
+ trace('Parser: got directive <%s>' % cmd)
491
+ if cmd[:5] == 'kivy ':
492
+ version = cmd[5:].strip()
493
+ if len(version.split('.')) == 2:
494
+ version += '.0'
495
+ require(version)
496
+ elif cmd[:4] == 'set ':
497
+ try:
498
+ name, value = cmd[4:].strip().split(' ', 1)
499
+ except:
500
+ Logger.exception('')
501
+ raise ParserException(self, ln, 'Invalid directive syntax')
502
+ try:
503
+ value = eval(value, global_idmap)
504
+ except:
505
+ Logger.exception('')
506
+ raise ParserException(self, ln, 'Invalid value')
507
+ global_idmap[name] = value
508
+ elif cmd[:8] == 'include ':
509
+ ref = cmd[8:].strip()
510
+ force_load = False
511
+
512
+ if ref[:6] == 'force ':
513
+ ref = ref[6:].strip()
514
+ force_load = True
515
+
516
+ # if #:include [force] "path with quotes around"
517
+ if ref[0] == ref[-1] and ref[0] in ('"', "'"):
518
+ c = ref[:3].count(ref[0])
519
+ ref = ref[c:-c] if c != 2 else ref
520
+
521
+ if ref[-3:] != '.kv':
522
+ Logger.warning('Lang: {0} does not have a valid Kivy'
523
+ 'Language extension (.kv)'.format(ref))
524
+ break
525
+ if ref in __KV_INCLUDES__:
526
+ if not os.path.isfile(resource_find(ref) or ref):
527
+ raise ParserException(self, ln,
528
+ 'Invalid or unknown file: {0}'
529
+ .format(ref))
530
+ if not force_load:
531
+ Logger.warning('Lang: {0} has already been included!'
532
+ .format(ref))
533
+ continue
534
+ else:
535
+ Logger.debug('Lang: Reloading {0} '
536
+ 'because include was forced.'
537
+ .format(ref))
538
+ kivy.lang.builder.Builder.unload_file(ref)
539
+ kivy.lang.builder.Builder.load_file(ref)
540
+ continue
541
+ Logger.debug('Lang: Including file: {0}'.format(0))
542
+ __KV_INCLUDES__.append(ref)
543
+ kivy.lang.builder.Builder.load_file(ref)
544
+ elif cmd[:7] == 'import ':
545
+ package = cmd[7:].strip()
546
+ z = package.split()
547
+ if len(z) != 2:
548
+ raise ParserException(self, ln, 'Invalid import syntax')
549
+ alias, package = z
550
+ try:
551
+ if package not in sys.modules:
552
+ try:
553
+ mod = importlib.__import__(package)
554
+ except ImportError:
555
+ module_name = '.'.join(package.split('.')[:-1])
556
+ mod = importlib.__import__(module_name)
557
+ # resolve the whole thing
558
+ for part in package.split('.')[1:]:
559
+ mod = getattr(mod, part)
560
+ else:
561
+ mod = sys.modules[package]
562
+ global_idmap[alias] = mod
563
+ except ImportError:
564
+ Logger.exception('')
565
+ raise ParserException(self, ln,
566
+ 'Unable to import package %r' %
567
+ package)
568
+ else:
569
+ raise ParserException(self, ln, 'Unknown directive')
570
+
571
+ def parse(self, content):
572
+ '''Parse the contents of a Parser file and return a list
573
+ of root objects.
574
+ '''
575
+ # Read and parse the lines of the file
576
+ lines = content.splitlines()
577
+ if not lines:
578
+ return
579
+ num_lines = len(lines)
580
+ lines = list(zip(list(range(num_lines)), lines))
581
+ self.sourcecode = lines[:]
582
+
583
+ if __debug__:
584
+ trace('Parser: parsing %d lines' % num_lines)
585
+
586
+ # Strip all comments
587
+ self.strip_comments(lines)
588
+
589
+ # Execute directives
590
+ self.execute_directives()
591
+
592
+ # Get object from the first level
593
+ objects, remaining_lines = self.parse_level(0, lines)
594
+
595
+ # Precompile rules tree
596
+ for rule in objects:
597
+ rule.precompile()
598
+
599
+ # After parsing, there should be no remaining lines
600
+ # or there's an error we did not catch earlier.
601
+ if remaining_lines:
602
+ ln, content = remaining_lines[0]
603
+ raise ParserException(self, ln, 'Invalid data (not parsed)')
604
+
605
+ def strip_comments(self, lines):
606
+ '''Remove all comments from all lines in-place.
607
+ Comments need to be on a single line and not at the end of a line.
608
+ i.e. a comment line's first non-whitespace character must be a #.
609
+ '''
610
+ # extract directives
611
+ for ln, line in lines[:]:
612
+ stripped = line.strip()
613
+ if stripped[:2] == '#:':
614
+ self.directives.append((ln, stripped[2:]))
615
+ if stripped[:1] == '#':
616
+ lines.remove((ln, line))
617
+ if not stripped:
618
+ lines.remove((ln, line))
619
+
620
+ def parse_level(self, level, lines, spaces=0):
621
+ '''Parse the current level (level * spaces) indentation.
622
+ '''
623
+ indent = spaces * level if spaces > 0 else 0
624
+ objects = []
625
+
626
+ current_object = None
627
+ current_property = None
628
+ current_propobject = None
629
+ i = 0
630
+ while i < len(lines):
631
+ line = lines[i]
632
+ ln, content = line
633
+
634
+ # Get the number of space
635
+ tmp = content.lstrip(' \t')
636
+
637
+ # Replace any tab with 4 spaces
638
+ tmp = content[:len(content) - len(tmp)]
639
+ tmp = tmp.replace('\t', ' ')
640
+
641
+ # first indent designates the indentation
642
+ if spaces == 0:
643
+ spaces = len(tmp)
644
+
645
+ count = len(tmp)
646
+
647
+ if spaces > 0 and count % spaces != 0:
648
+ raise ParserException(self, ln,
649
+ 'Invalid indentation, '
650
+ 'must be a multiple of '
651
+ '%s spaces' % spaces)
652
+ content = content.strip()
653
+ rlevel = count // spaces if spaces > 0 else 0
654
+
655
+ # Level finished
656
+ if count < indent:
657
+ return objects, lines[i - 1:]
658
+
659
+ # Current level, create an object
660
+ elif count == indent:
661
+ x = content.split(':', 1)
662
+ if not x[0]:
663
+ raise ParserException(self, ln, 'Identifier missing')
664
+ if (len(x) == 2 and len(x[1]) and
665
+ not x[1].lstrip().startswith('#')):
666
+ raise ParserException(self, ln,
667
+ 'Invalid data after declaration')
668
+ name = x[0].rstrip()
669
+ # if it's not a root rule, then we got some restriction
670
+ # aka, a valid name, without point or everything else
671
+ if count != 0:
672
+ if False in [ord(z) in Parser.PROP_RANGE for z in name]:
673
+ raise ParserException(self, ln, 'Invalid class name')
674
+
675
+ current_object = ParserRule(self, ln, name, rlevel)
676
+ current_property = None
677
+ objects.append(current_object)
678
+
679
+ # Next level, is it a property or an object ?
680
+ elif count == indent + spaces:
681
+ x = content.split(':', 1)
682
+ if not x[0]:
683
+ raise ParserException(self, ln, 'Identifier missing')
684
+
685
+ # It's a class, add to the current object as a children
686
+ current_property = None
687
+ name = x[0].rstrip()
688
+ ignore_prev = name[0] == '-'
689
+ if ignore_prev:
690
+ name = name[1:]
691
+
692
+ if ord(name[0]) in Parser.CLASS_RANGE:
693
+ if ignore_prev:
694
+ raise ParserException(
695
+ self, ln, 'clear previous, `-`, not allowed here')
696
+ _objects, _lines = self.parse_level(
697
+ level + 1, lines[i:], spaces)
698
+ if current_object is None:
699
+ raise ParserException(self, ln, 'Invalid indentation')
700
+ current_object.children = _objects
701
+ lines = _lines
702
+ i = 0
703
+
704
+ # It's a property
705
+ else:
706
+ if name not in Parser.PROP_ALLOWED:
707
+ if not all(ord(z) in Parser.PROP_RANGE for z in name):
708
+ raise ParserException(self, ln,
709
+ 'Invalid property name')
710
+ if len(x) == 1:
711
+ raise ParserException(self, ln, 'Syntax error')
712
+ value = x[1].strip()
713
+ if name == 'id':
714
+ if len(value) <= 0:
715
+ raise ParserException(self, ln, 'Empty id')
716
+ if value in ('self', 'root'):
717
+ raise ParserException(
718
+ self, ln,
719
+ 'Invalid id, cannot be "self" or "root"')
720
+ current_object.id = value
721
+ elif len(value):
722
+ rule = ParserRuleProperty(
723
+ self, ln, name, value, ignore_prev)
724
+ if name[:3] == 'on_':
725
+ current_object.handlers.append(rule)
726
+ else:
727
+ ignore_prev = False
728
+ current_object.properties[name] = rule
729
+ else:
730
+ current_property = name
731
+ current_propobject = None
732
+
733
+ if ignore_prev: # it wasn't consumed
734
+ raise ParserException(
735
+ self, ln, 'clear previous, `-`, not allowed here')
736
+
737
+ # Two more levels?
738
+ elif count == indent + 2 * spaces:
739
+ if current_property in (
740
+ 'canvas', 'canvas.after', 'canvas.before'):
741
+ _objects, _lines = self.parse_level(
742
+ level + 2, lines[i:], spaces)
743
+ rl = ParserRule(self, ln, current_property, rlevel)
744
+ rl.children = _objects
745
+ if current_property == 'canvas':
746
+ current_object.canvas_root = rl
747
+ elif current_property == 'canvas.before':
748
+ current_object.canvas_before = rl
749
+ else:
750
+ current_object.canvas_after = rl
751
+ current_property = None
752
+ lines = _lines
753
+ i = 0
754
+ else:
755
+ if current_propobject is None:
756
+ current_propobject = ParserRuleProperty(
757
+ self, ln, current_property, content)
758
+ if not current_property:
759
+ raise ParserException(self, ln,
760
+ "Invalid indentation")
761
+ if current_property[:3] == 'on_':
762
+ current_object.handlers.append(current_propobject)
763
+ else:
764
+ current_object.properties[current_property] = \
765
+ current_propobject
766
+ else:
767
+ current_propobject.value += '\n' + content
768
+
769
+ # Too much indentation, invalid
770
+ else:
771
+ raise ParserException(self, ln,
772
+ 'Invalid indentation (too many levels)')
773
+
774
+ # Check the next line
775
+ i += 1
776
+
777
+ return objects, []
778
+
779
+
780
+ class ParserSelector(object):
781
+
782
+ def __init__(self, key):
783
+ self.key = key.lower()
784
+
785
+ def match(self, widget):
786
+ raise NotImplementedError
787
+
788
+ def __repr__(self):
789
+ return '<%s key=%s>' % (self.__class__.__name__, self.key)
790
+
791
+
792
+ class ParserSelectorClass(ParserSelector):
793
+
794
+ def match(self, widget):
795
+ return self.key in widget.cls
796
+
797
+
798
+ class ParserSelectorName(ParserSelector):
799
+
800
+ parents = {}
801
+
802
+ def get_bases(self, cls):
803
+ for base in cls.__bases__:
804
+ if base.__name__ == 'object':
805
+ break
806
+ yield base
807
+ if base.__name__ == 'Widget':
808
+ break
809
+ for cbase in self.get_bases(base):
810
+ yield cbase
811
+
812
+ def match(self, widget):
813
+ parents = ParserSelectorName.parents
814
+ cls = widget.__class__
815
+ if cls not in parents:
816
+ classes = [x.__name__.lower() for x in
817
+ [cls] + list(self.get_bases(cls))]
818
+ parents[cls] = classes
819
+ return self.key in parents[cls]
820
+
821
+ def match_rule_name(self, rule_name):
822
+ return self.key == rule_name.lower()