typus 3.0.2 → 3.0.4

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 (343) hide show
  1. data/Gemfile +20 -9
  2. data/Gemfile.lock +93 -65
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +61 -0
  5. data/Rakefile +5 -0
  6. data/app/controllers/admin/account_controller.rb +7 -10
  7. data/app/controllers/admin/base_controller.rb +16 -1
  8. data/app/controllers/admin/resources_controller.rb +270 -159
  9. data/app/controllers/admin/session_controller.rb +8 -9
  10. data/app/helpers/admin/base_helper.rb +13 -28
  11. data/app/helpers/admin/dashboard_helper.rb +4 -10
  12. data/app/helpers/admin/file_preview_helper.rb +70 -0
  13. data/app/helpers/admin/filters_helper.rb +64 -45
  14. data/app/helpers/admin/form_helper.rb +37 -62
  15. data/app/helpers/admin/relationships_helper.rb +63 -78
  16. data/app/helpers/admin/resources_helper.rb +10 -31
  17. data/app/helpers/admin/search_helper.rb +6 -9
  18. data/app/helpers/admin/sidebar_helper.rb +15 -20
  19. data/app/helpers/admin/table_helper.rb +79 -170
  20. data/app/mailers/admin/mailer.rb +1 -1
  21. data/app/views/admin/account/forgot_password.html.erb +2 -2
  22. data/app/views/admin/account/new.html.erb +8 -4
  23. data/app/views/admin/base/user_guide.html.erb +85 -0
  24. data/app/views/admin/dashboard/_sidebar.html.erb +3 -1
  25. data/app/views/admin/dashboard/show.html.erb +2 -2
  26. data/app/views/admin/dashboard/styles.html.erb +2 -2
  27. data/app/views/admin/helpers/_apps.html.erb +5 -4
  28. data/app/views/admin/helpers/_file_preview.html.erb +3 -0
  29. data/app/views/admin/helpers/_header.html.erb +3 -3
  30. data/app/views/admin/helpers/_login_info.html.erb +2 -2
  31. data/app/views/admin/helpers/dashboard/_applications.html.erb +6 -9
  32. data/app/views/admin/helpers/dashboard/_resources.html.erb +2 -3
  33. data/app/views/admin/helpers/filters/_filters.html.erb +1 -1
  34. data/app/views/admin/helpers/resources/_display_link_to_previous.html.erb +1 -1
  35. data/app/views/admin/helpers/resources/_errors.html.erb +10 -0
  36. data/app/views/admin/helpers/search/_search.html.erb +1 -1
  37. data/app/views/admin/helpers/sidebar/_sidebar.html.erb +6 -3
  38. data/app/views/admin/helpers/table/_table.html.erb +17 -5
  39. data/app/views/admin/mailer/reset_password_link.text.erb +2 -2
  40. data/app/views/admin/resources/_form.html.erb +3 -12
  41. data/app/views/admin/resources/edit.html.erb +7 -5
  42. data/app/views/admin/resources/index.html.erb +13 -18
  43. data/app/views/admin/resources/new.html.erb +4 -4
  44. data/app/views/admin/resources/show.html.erb +9 -13
  45. data/app/views/admin/session/new.html.erb +8 -4
  46. data/app/views/admin/templates/_belongs_to.html.erb +1 -1
  47. data/app/views/admin/templates/_boolean.html.erb +2 -2
  48. data/app/views/admin/templates/_date.html.erb +2 -2
  49. data/app/views/admin/templates/_datetime.html.erb +2 -2
  50. data/app/views/admin/templates/_file.html.erb +3 -19
  51. data/app/views/admin/templates/_has_n.html.erb +4 -4
  52. data/app/views/admin/templates/_has_one.html.erb +14 -0
  53. data/app/views/admin/templates/_password.html.erb +2 -2
  54. data/app/views/admin/templates/_profile_sidebar.html.erb +3 -0
  55. data/app/views/admin/templates/_relate_form.html.erb +2 -1
  56. data/app/views/admin/templates/_selector.html.erb +1 -1
  57. data/app/views/admin/templates/_string.html.erb +6 -6
  58. data/app/views/admin/templates/_text.html.erb +11 -4
  59. data/app/views/admin/templates/_time.html.erb +2 -2
  60. data/app/views/admin/templates/_tree.html.erb +1 -1
  61. data/app/views/layouts/admin/base.html.erb +7 -6
  62. data/app/views/layouts/admin/session.html.erb +4 -14
  63. data/config/{available_locales/ca_models.yml → locales/typus.ca.models.yml} +5 -4
  64. data/config/locales/typus.ca.yml +81 -0
  65. data/config/{available_locales/de_models.yml → locales/typus.de.models.yml} +6 -2
  66. data/config/locales/typus.de.yml +80 -0
  67. data/config/locales/typus.el.models.yml +17 -0
  68. data/config/locales/typus.el.yml +82 -0
  69. data/config/{available_locales/es_models.yml → locales/typus.es.models.yml} +9 -4
  70. data/config/locales/typus.es.yml +82 -0
  71. data/config/{available_locales/fr_models.yml → locales/typus.fr.models.yml} +8 -3
  72. data/config/locales/typus.fr.yml +87 -0
  73. data/config/{available_locales/hu_models.yml → locales/typus.hu.models.yml} +6 -2
  74. data/config/locales/typus.hu.yml +80 -0
  75. data/config/{available_locales/it_models.yml → locales/typus.it.models.yml} +7 -4
  76. data/config/locales/typus.it.yml +89 -0
  77. data/config/{available_locales/language_models.yml.template → locales/typus.locale.models.yml.template} +8 -4
  78. data/config/locales/typus.locale.yml.template +81 -0
  79. data/config/{available_locales/pt-BR_models.yml → locales/typus.pt-BR.models.yml} +6 -2
  80. data/config/locales/typus.pt-BR.yml +80 -0
  81. data/config/{available_locales/ru_models.yml → locales/typus.ru.models.yml} +6 -2
  82. data/config/locales/typus.ru.yml +80 -0
  83. data/config/locales/typus.zh-CN.models.yml +17 -0
  84. data/config/locales/typus.zh-CN.yml +79 -0
  85. data/config/routes.rb +11 -7
  86. data/lib/generators/templates/config/initializers/typus.rb +8 -5
  87. data/lib/generators/templates/config/initializers/typus_resources.rb +0 -3
  88. data/lib/generators/templates/config/typus/README +6 -6
  89. data/lib/generators/templates/config/typus/typus.yml +5 -5
  90. data/lib/generators/templates/controller.rb +1 -1
  91. data/lib/generators/templates/migration.rb +1 -0
  92. data/lib/generators/templates/public/admin/javascripts/application.js +0 -4
  93. data/lib/generators/templates/public/admin/javascripts/jquery-1.4.4.min.js +167 -0
  94. data/lib/generators/templates/public/admin/javascripts/jquery.application.js +16 -0
  95. data/lib/generators/templates/public/admin/javascripts/jquery.rails.js +50 -22
  96. data/lib/generators/templates/public/admin/stylesheets/screen.css +43 -34
  97. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_loading.png +0 -0
  98. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.easing-1.3.pack.js +32 -32
  99. data/lib/generators/templates/public/admin/vendor/fancybox/{jquery.fancybox-1.3.1.css → jquery.fancybox-1.3.4.css} +359 -363
  100. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.fancybox-1.3.4.js +1156 -0
  101. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.fancybox-1.3.4.pack.js +46 -0
  102. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.mousewheel-3.0.4.pack.js +14 -0
  103. data/lib/generators/typus/assets_generator.rb +23 -0
  104. data/lib/generators/typus/controller_generator.rb +29 -0
  105. data/lib/generators/typus/migration_generator.rb +39 -20
  106. data/lib/generators/typus/typus_generator.rb +17 -57
  107. data/lib/generators/typus/views_generator.rb +2 -6
  108. data/lib/support/active_record.rb +8 -20
  109. data/lib/support/fake_user.rb +6 -1
  110. data/lib/support/hash.rb +1 -2
  111. data/lib/support/object.rb +4 -17
  112. data/lib/support/string.rb +34 -3
  113. data/lib/tasks/typus.rake +1 -1
  114. data/lib/typus.rb +60 -48
  115. data/lib/typus/actions.rb +27 -0
  116. data/lib/typus/authentication/base.rb +3 -4
  117. data/lib/typus/authentication/http_basic.rb +1 -1
  118. data/lib/typus/authentication/none.rb +1 -1
  119. data/lib/typus/authentication/session.rb +53 -108
  120. data/lib/typus/configuration.rb +13 -11
  121. data/lib/typus/filters.rb +12 -0
  122. data/lib/typus/format.rb +9 -13
  123. data/lib/typus/i18n.rb +30 -0
  124. data/lib/typus/orm/active_record.rb +97 -194
  125. data/lib/typus/orm/active_record/search.rb +91 -0
  126. data/lib/typus/resources.rb +6 -10
  127. data/lib/typus/user.rb +20 -40
  128. data/lib/typus/version.rb +1 -1
  129. metadata +77 -231
  130. data/CHANGELOG +0 -102
  131. data/README.rdoc +0 -48
  132. data/app/helpers/admin/preview_helper.rb +0 -46
  133. data/app/views/admin/helpers/_preview.html.erb +0 -13
  134. data/app/views/admin/templates/_has_many.html.erb +0 -22
  135. data/config/available_locales/ca.yml +0 -122
  136. data/config/available_locales/de.yml +0 -122
  137. data/config/available_locales/es.yml +0 -122
  138. data/config/available_locales/fr.yml +0 -127
  139. data/config/available_locales/hu.yml +0 -122
  140. data/config/available_locales/it.yml +0 -132
  141. data/config/available_locales/language.yml.template +0 -120
  142. data/config/available_locales/pt-BR.yml +0 -122
  143. data/config/available_locales/ru.yml +0 -122
  144. data/lib/generators/templates/functional_test.rb +0 -10
  145. data/lib/generators/templates/model.rb +0 -8
  146. data/lib/generators/templates/public/admin/images/ui-icons.png +0 -0
  147. data/lib/generators/templates/public/admin/javascripts/jquery-1.4.2.min.js +0 -154
  148. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.fancybox-1.3.1.js +0 -1077
  149. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  150. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.mousewheel-3.0.2.pack.js +0 -13
  151. data/lib/typus/pagination.rb +0 -18
  152. data/test/factories.rb +0 -43
  153. data/test/fixtures/config/broken/application.yml +0 -68
  154. data/test/fixtures/config/broken/application_roles.yml +0 -20
  155. data/test/fixtures/config/broken/empty.yml +0 -0
  156. data/test/fixtures/config/broken/empty_roles.yml +0 -0
  157. data/test/fixtures/config/broken/undefined.yml +0 -3
  158. data/test/fixtures/config/broken/undefined_roles.yml +0 -6
  159. data/test/fixtures/config/default/typus.yml +0 -13
  160. data/test/fixtures/config/default/typus_roles.yml +0 -2
  161. data/test/fixtures/config/empty/empty_01.yml +0 -0
  162. data/test/fixtures/config/empty/empty_01_roles.yml +0 -0
  163. data/test/fixtures/config/empty/empty_02.yml +0 -0
  164. data/test/fixtures/config/empty/empty_02_roles.yml +0 -0
  165. data/test/fixtures/config/locales/es.yml +0 -10
  166. data/test/fixtures/config/namespaced/application.yml +0 -5
  167. data/test/fixtures/config/namespaced/application_roles.yml +0 -2
  168. data/test/fixtures/config/ordered/001_roles.yml +0 -2
  169. data/test/fixtures/config/ordered/002_roles.yml +0 -2
  170. data/test/fixtures/config/unordered/app_one_roles.yml +0 -2
  171. data/test/fixtures/config/unordered/app_two_roles.yml +0 -2
  172. data/test/fixtures/config/working/application.yml +0 -73
  173. data/test/fixtures/config/working/application_roles.yml +0 -24
  174. data/test/fixtures/config/working/typus.yml +0 -13
  175. data/test/fixtures/config/working/typus_roles.yml +0 -2
  176. data/test/fixtures/rails_app/Rakefile +0 -7
  177. data/test/fixtures/rails_app/app/controllers/admin/assets_controller.rb +0 -2
  178. data/test/fixtures/rails_app/app/controllers/admin/categories_controller.rb +0 -2
  179. data/test/fixtures/rails_app/app/controllers/admin/comments_controller.rb +0 -2
  180. data/test/fixtures/rails_app/app/controllers/admin/pages_controller.rb +0 -2
  181. data/test/fixtures/rails_app/app/controllers/admin/pictures_controller.rb +0 -2
  182. data/test/fixtures/rails_app/app/controllers/admin/posts_controller.rb +0 -2
  183. data/test/fixtures/rails_app/app/controllers/admin/status_controller.rb +0 -2
  184. data/test/fixtures/rails_app/app/controllers/admin/typus_users_controller.rb +0 -2
  185. data/test/fixtures/rails_app/app/controllers/admin/watch_dog_controller.rb +0 -2
  186. data/test/fixtures/rails_app/app/controllers/application_controller.rb +0 -3
  187. data/test/fixtures/rails_app/app/models/asset.rb +0 -5
  188. data/test/fixtures/rails_app/app/models/category.rb +0 -11
  189. data/test/fixtures/rails_app/app/models/comment.rb +0 -6
  190. data/test/fixtures/rails_app/app/models/custom_user.rb +0 -2
  191. data/test/fixtures/rails_app/app/models/delayed/task.rb +0 -5
  192. data/test/fixtures/rails_app/app/models/page.rb +0 -5
  193. data/test/fixtures/rails_app/app/models/picture.rb +0 -6
  194. data/test/fixtures/rails_app/app/models/post.rb +0 -21
  195. data/test/fixtures/rails_app/app/models/typus_user.rb +0 -8
  196. data/test/fixtures/rails_app/app/models/view.rb +0 -5
  197. data/test/fixtures/rails_app/app/views/admin/categories/_form.html.erb +0 -1
  198. data/test/fixtures/rails_app/app/views/admin/dashboard/_sidebar.html.erb +0 -1
  199. data/test/fixtures/rails_app/app/views/admin/mailer/reset_password_link.text.erb +0 -6
  200. data/test/fixtures/rails_app/app/views/admin/posts/_edit.html.erb +0 -1
  201. data/test/fixtures/rails_app/app/views/admin/posts/_index.html.erb +0 -1
  202. data/test/fixtures/rails_app/app/views/admin/posts/_new.html.erb +0 -1
  203. data/test/fixtures/rails_app/app/views/admin/posts/_show.html.erb +0 -1
  204. data/test/fixtures/rails_app/app/views/admin/posts/_sidebar.html.erb +0 -1
  205. data/test/fixtures/rails_app/app/views/admin/resources/_sidebar.html.erb +0 -1
  206. data/test/fixtures/rails_app/app/views/admin/status/index.html.erb +0 -1
  207. data/test/fixtures/rails_app/app/views/admin/templates/_datepicker.html.erb +0 -1
  208. data/test/fixtures/rails_app/config.ru +0 -4
  209. data/test/fixtures/rails_app/config/application.rb +0 -53
  210. data/test/fixtures/rails_app/config/boot.rb +0 -13
  211. data/test/fixtures/rails_app/config/database.yml +0 -14
  212. data/test/fixtures/rails_app/config/environment.rb +0 -5
  213. data/test/fixtures/rails_app/config/environments/test.rb +0 -34
  214. data/test/fixtures/rails_app/config/initializers/secret_token.rb +0 -7
  215. data/test/fixtures/rails_app/config/initializers/session_store.rb +0 -8
  216. data/test/fixtures/rails_app/config/initializers/typus.rb +0 -6
  217. data/test/fixtures/rails_app/config/routes.rb +0 -5
  218. data/test/fixtures/rails_app/config/typus/application.yml +0 -79
  219. data/test/fixtures/rails_app/config/typus/application_roles.yml +0 -25
  220. data/test/fixtures/rails_app/config/typus/typus.yml +0 -12
  221. data/test/fixtures/rails_app/config/typus/typus_roles.yml +0 -2
  222. data/test/fixtures/rails_app/db/test.sqlite3 +0 -0
  223. data/test/fixtures/rails_app/tmp/export-posts-20101012213057.csv +0 -2
  224. data/test/fixtures/rails_app/tmp/export-posts-20101012213132.csv +0 -2
  225. data/test/fixtures/rails_app/tmp/export-posts-20101012213234.csv +0 -2
  226. data/test/fixtures/rails_app/tmp/export-posts-20101012213506.csv +0 -2
  227. data/test/fixtures/rails_app/tmp/export-posts-20101012215057.csv +0 -2
  228. data/test/fixtures/rails_app/tmp/export-posts-20101012215217.csv +0 -2
  229. data/test/fixtures/rails_app/tmp/export-posts-20101012215415.csv +0 -2
  230. data/test/fixtures/rails_app/tmp/export-posts-20101012215443.csv +0 -2
  231. data/test/fixtures/rails_app/tmp/export-posts-20101012215509.csv +0 -2
  232. data/test/fixtures/rails_app/tmp/export-posts-20101012215528.csv +0 -2
  233. data/test/fixtures/rails_app/tmp/export-posts-20101012215551.csv +0 -2
  234. data/test/fixtures/rails_app/tmp/export-posts-20101012215615.csv +0 -2
  235. data/test/fixtures/rails_app/tmp/export-posts-20101012215640.csv +0 -2
  236. data/test/fixtures/rails_app/tmp/export-posts-20101012215714.csv +0 -2
  237. data/test/fixtures/rails_app/tmp/export-posts-20101012215744.csv +0 -2
  238. data/test/fixtures/rails_app/tmp/export-posts-20101012215814.csv +0 -2
  239. data/test/fixtures/rails_app/tmp/export-posts-20101012215836.csv +0 -2
  240. data/test/fixtures/rails_app/tmp/export-posts-20101012215906.csv +0 -2
  241. data/test/fixtures/rails_app/tmp/export-posts-20101012220659.csv +0 -2
  242. data/test/fixtures/rails_app/tmp/export-posts-20101012221043.csv +0 -2
  243. data/test/fixtures/rails_app/tmp/export-posts-20101012221258.csv +0 -2
  244. data/test/fixtures/rails_app/tmp/export-posts-20101012222558.csv +0 -2
  245. data/test/fixtures/rails_app/tmp/export-posts-20101012222752.csv +0 -2
  246. data/test/fixtures/rails_app/tmp/export-posts-20101012222848.csv +0 -2
  247. data/test/fixtures/rails_app/tmp/export-posts-20101012223433.csv +0 -2
  248. data/test/fixtures/rails_app/tmp/export-posts-20101012223535.csv +0 -2
  249. data/test/fixtures/rails_app/tmp/export-posts-20101012224003.csv +0 -2
  250. data/test/fixtures/rails_app/tmp/export-posts-20101012224052.csv +0 -2
  251. data/test/fixtures/rails_app/tmp/export-posts-20101012224109.csv +0 -2
  252. data/test/fixtures/rails_app/tmp/export-posts-20101012224139.csv +0 -2
  253. data/test/fixtures/rails_app/tmp/export-posts-20101012224205.csv +0 -2
  254. data/test/fixtures/rails_app/tmp/export-posts-20101012224243.csv +0 -2
  255. data/test/fixtures/rails_app/tmp/export-posts-20101012225119.csv +0 -2
  256. data/test/fixtures/rails_app/tmp/export-posts-20101013063215.csv +0 -2
  257. data/test/fixtures/rails_app/tmp/export-posts-20101013063300.csv +0 -2
  258. data/test/fixtures/rails_app/tmp/export-posts-20101013063352.csv +0 -2
  259. data/test/fixtures/rails_app/tmp/export-posts-20101013063427.csv +0 -2
  260. data/test/fixtures/rails_app/tmp/export-posts-20101013063448.csv +0 -2
  261. data/test/fixtures/rails_app/tmp/export-posts-20101013063530.csv +0 -2
  262. data/test/fixtures/rails_app/tmp/export-posts-20101013063559.csv +0 -2
  263. data/test/fixtures/rails_app/tmp/export-posts-20101013063646.csv +0 -2
  264. data/test/fixtures/rails_app/tmp/export-posts-20101013063737.csv +0 -2
  265. data/test/fixtures/rails_app/tmp/export-posts-20101013063822.csv +0 -2
  266. data/test/fixtures/rails_app/tmp/export-posts-20101013063837.csv +0 -2
  267. data/test/fixtures/rails_app/tmp/export-posts-20101013063919.csv +0 -2
  268. data/test/fixtures/rails_app/tmp/export-posts-20101013063939.csv +0 -2
  269. data/test/fixtures/rails_app/tmp/export-posts-20101013063952.csv +0 -2
  270. data/test/fixtures/rails_app/tmp/export-posts-20101013064220.csv +0 -2
  271. data/test/fixtures/rails_app/tmp/export-posts-20101013064253.csv +0 -2
  272. data/test/fixtures/rails_app/tmp/export-posts-20101013064318.csv +0 -2
  273. data/test/fixtures/rails_app/tmp/export-posts-20101013064404.csv +0 -2
  274. data/test/fixtures/rails_app/tmp/export-posts-20101013064452.csv +0 -2
  275. data/test/fixtures/rails_app/tmp/export-posts-20101013064536.csv +0 -2
  276. data/test/fixtures/rails_app/tmp/export-posts-20101013064652.csv +0 -2
  277. data/test/fixtures/rails_app/tmp/export-posts-20101013064845.csv +0 -2
  278. data/test/fixtures/rails_app/tmp/export-posts-20101013065023.csv +0 -2
  279. data/test/fixtures/rails_app/tmp/export-posts-20101013065137.csv +0 -2
  280. data/test/fixtures/rails_app/tmp/export-posts-20101013065713.csv +0 -2
  281. data/test/fixtures/rails_app/tmp/export-posts-20101013065954.csv +0 -2
  282. data/test/fixtures/rails_app/tmp/export-posts-20101013070057.csv +0 -2
  283. data/test/fixtures/rails_app/tmp/export-posts-20101013070116.csv +0 -2
  284. data/test/fixtures/rails_app/tmp/export-posts-20101013070156.csv +0 -2
  285. data/test/fixtures/rails_app/tmp/export-posts-20101013070349.csv +0 -2
  286. data/test/fixtures/rails_app/tmp/export-posts-20101013070429.csv +0 -2
  287. data/test/fixtures/rails_app/tmp/export-posts-20101013070448.csv +0 -2
  288. data/test/fixtures/rails_app/tmp/export-posts-20101013070514.csv +0 -2
  289. data/test/fixtures/rails_app/tmp/export-posts-20101013070709.csv +0 -2
  290. data/test/fixtures/rails_app/tmp/export-posts-20101013070745.csv +0 -2
  291. data/test/fixtures/rails_app/tmp/export-posts-20101013070809.csv +0 -2
  292. data/test/fixtures/rails_app/tmp/export-posts-20101013070905.csv +0 -2
  293. data/test/fixtures/rails_app/tmp/export-posts-20101013070955.csv +0 -2
  294. data/test/fixtures/rails_app/tmp/export-posts-20101013071116.csv +0 -2
  295. data/test/fixtures/rails_app/tmp/export-posts-20101013071209.csv +0 -2
  296. data/test/fixtures/rails_app/tmp/export-posts-20101013071335.csv +0 -2
  297. data/test/fixtures/rails_app/tmp/export-posts-20101013071632.csv +0 -2
  298. data/test/fixtures/rails_app/tmp/export-posts-20101013071643.csv +0 -2
  299. data/test/fixtures/rails_app/tmp/export-posts-20101013071735.csv +0 -2
  300. data/test/fixtures/rails_app/tmp/export-posts-20101013071749.csv +0 -2
  301. data/test/fixtures/rails_app/tmp/export-posts-20101013072030.csv +0 -2
  302. data/test/fixtures/rails_app/tmp/export-posts-20101013072050.csv +0 -2
  303. data/test/fixtures/rails_app/tmp/export-posts-20101013072108.csv +0 -2
  304. data/test/fixtures/rails_app/tmp/export-posts-20101013072713.csv +0 -2
  305. data/test/fixtures/rails_app/tmp/export-posts-20101013072751.csv +0 -2
  306. data/test/fixtures/rails_app/tmp/export-posts-20101013072912.csv +0 -2
  307. data/test/fixtures/rails_app/tmp/export-posts-20101013074546.csv +0 -2
  308. data/test/fixtures/rails_app/tmp/export-posts-20101018180512.csv +0 -2
  309. data/test/fixtures/rails_app/tmp/export-posts-20101018183359.csv +0 -2
  310. data/test/fixtures/rails_app/tmp/export-posts-20101018183608.csv +0 -2
  311. data/test/fixtures/rails_app/tmp/export-posts-20101018183759.csv +0 -2
  312. data/test/functional/admin/account_controller_test.rb +0 -90
  313. data/test/functional/admin/assets_controller_test.rb +0 -55
  314. data/test/functional/admin/categories_controller_test.rb +0 -62
  315. data/test/functional/admin/comments_controller_test.rb +0 -21
  316. data/test/functional/admin/dashboard_controller_test.rb +0 -138
  317. data/test/functional/admin/posts_controller_test.rb +0 -548
  318. data/test/functional/admin/session_controller_test.rb +0 -85
  319. data/test/functional/admin/status_controller_test.rb +0 -46
  320. data/test/functional/admin/typus_users_controller_test.rb +0 -159
  321. data/test/helpers/admin/base_helper_test.rb +0 -67
  322. data/test/helpers/admin/dashboard_helper_test.rb +0 -19
  323. data/test/helpers/admin/form_helper_test.rb +0 -117
  324. data/test/helpers/admin/resources_helper_test.rb +0 -64
  325. data/test/helpers/admin/sidebar_helper_test.rb +0 -274
  326. data/test/helpers/admin/table_helper_test.rb +0 -219
  327. data/test/integration/login_test.rb +0 -13
  328. data/test/integration_test_helper.rb +0 -21
  329. data/test/lib/support/active_record_test.rb +0 -86
  330. data/test/lib/support/array_test.rb +0 -11
  331. data/test/lib/support/hash_test.rb +0 -11
  332. data/test/lib/support/string_test.rb +0 -39
  333. data/test/lib/typus/active_record_test.rb +0 -451
  334. data/test/lib/typus/configuration_test.rb +0 -52
  335. data/test/lib/typus/resource_test.rb +0 -17
  336. data/test/lib/typus/routes_test.rb +0 -29
  337. data/test/lib/typus_test.rb +0 -107
  338. data/test/schema.rb +0 -100
  339. data/test/test_helper.rb +0 -16
  340. data/test/unit/admin/mailer_test.rb +0 -32
  341. data/test/unit/typus_user_roles_test.rb +0 -105
  342. data/test/unit/typus_user_test.rb +0 -142
  343. data/typus.gemspec +0 -25
@@ -1,13 +0,0 @@
1
- require 'integration_test_helper'
2
-
3
- class LoginTest < ActionController::IntegrationTest
4
-
5
- feature "Admin goes to login page" do
6
-
7
- scenario "views page" do
8
- visit '/admin'
9
- end
10
-
11
- end
12
-
13
- end
@@ -1,21 +0,0 @@
1
- require 'test_helper'
2
- require 'capybara/rails'
3
-
4
- module ActionController
5
-
6
- class IntegrationTest
7
- include Capybara
8
- end
9
-
10
- end
11
-
12
- module Shoulda
13
-
14
- module ClassMethods
15
-
16
- alias :feature :context
17
- alias :scenario :should
18
-
19
- end
20
-
21
- end
@@ -1,86 +0,0 @@
1
- require "test_helper"
2
-
3
- class ActiveRecordTest < ActiveSupport::TestCase
4
-
5
- context "mapping" do
6
-
7
- context "with an array" do
8
-
9
- setup do
10
- Post.send(:remove_const, :STATUS)
11
- Post::STATUS = %w(pending published unpublished)
12
- end
13
-
14
- should "verify" do
15
- post = Factory(:post)
16
- assert_equal "published", post.mapping(:status)
17
- post = Factory(:post, :status => "unpublished")
18
- assert_equal "unpublished", post.mapping(:status)
19
- end
20
-
21
- end
22
-
23
- context "with a two dimension array" do
24
-
25
- setup do
26
- Post.send(:remove_const, :STATUS)
27
- Post::STATUS = [["Publicado", "published"], ["Pendiente", "pending"], ["No publicado", "unpublished"]]
28
- end
29
-
30
- should "verify" do
31
- post = Factory(:post)
32
- assert_equal "Publicado", post.mapping(:status)
33
- post = Factory(:post, :status => "unpublished")
34
- assert_equal "No publicado", post.mapping(:status)
35
- end
36
-
37
- end
38
-
39
- context "with a hash" do
40
-
41
- setup do
42
- Post.send(:remove_const, :STATUS)
43
- Post::STATUS = { "Pending - Hash" => "pending", "Published - Hash" => "published", "Not Published - Hash" => "unpublished" }
44
- end
45
-
46
- should "verify" do
47
- page = Factory(:post)
48
- assert_equal "Published - Hash", page.mapping(:status)
49
- page = Factory(:post, :status => "unpublished")
50
- assert_equal "Not Published - Hash", page.mapping(:status)
51
- end
52
-
53
- end
54
-
55
- end
56
-
57
- context "to_label" do
58
-
59
- should "return email as is an alias for to_label on TypusUser" do
60
- assert_equal "admin@example.com", Factory(:typus_user).to_label
61
- end
62
-
63
- should "return name for Category" do
64
- category = Factory(:category)
65
- assert_match category.name, category.to_label
66
- end
67
-
68
- should "return default Model#id" do
69
- assert_match /Post#/, Factory(:post).to_label
70
- end
71
-
72
- end
73
-
74
- context "to_resource" do
75
-
76
- should "work for models" do
77
- assert_equal "typus_users", TypusUser.to_resource
78
- end
79
-
80
- should "work for namespaced models" do
81
- assert_equal "delayed/tasks", Delayed::Task.to_resource
82
- end
83
-
84
- end
85
-
86
- end
@@ -1,11 +0,0 @@
1
- require "test_helper"
2
-
3
- class ArrayTest < ActiveSupport::TestCase
4
-
5
- should "verify to_hash_with" do
6
- keys, values = %w(a b c), %w(1 2 3)
7
- expected = { "a" => "1", "b" => "2", "c" => "3" }
8
- assert_equal expected, keys.to_hash_with(values)
9
- end
10
-
11
- end
@@ -1,11 +0,0 @@
1
- require "test_helper"
2
-
3
- class HashTest < ActiveSupport::TestCase
4
-
5
- should "verify Hash#compact" do
6
- hash = { "a" => "", "b" => nil, "c" => "hello" }
7
- hash_compacted = { "c" => "hello" }
8
- assert_equal hash_compacted, hash.compact
9
- end
10
-
11
- end
@@ -1,39 +0,0 @@
1
- require "test_helper"
2
-
3
- class StringTest < ActiveSupport::TestCase
4
-
5
- should "extract_settings" do
6
- assert_equal %w( a b c ), "a, b, c".extract_settings
7
- assert_equal %w( a b c ), " a , b, c ".extract_settings
8
- end
9
-
10
- context "remove_prefix" do
11
-
12
- should "remove admin by default" do
13
- assert_equal "posts", "admin/posts".remove_prefix
14
- assert_equal "typus_users", "admin/typus_users".remove_prefix
15
- assert_equal "delayed/jobs", "admin/delayed/jobs".remove_prefix
16
- end
17
-
18
- should "remove what we want to" do
19
- assert_equal "posts", "typus/posts".remove_prefix("typus/")
20
- assert_equal "typus_users", "typus/typus_users".remove_prefix("typus/")
21
- assert_equal "delayed/tasks", "typus/delayed/tasks".remove_prefix("typus/")
22
- end
23
-
24
- end
25
-
26
- context "extract_class" do
27
-
28
- should "work for models" do
29
- assert_equal Post, "admin/posts".extract_class
30
- assert_equal TypusUser, "admin/typus_users".extract_class
31
- end
32
-
33
- should "work for namespaced models" do
34
- assert_equal Delayed::Task, "admin/delayed/tasks".extract_class
35
- end
36
-
37
- end
38
-
39
- end
@@ -1,451 +0,0 @@
1
- require "test_helper"
2
-
3
- class ActiveRecordTest < ActiveSupport::TestCase
4
-
5
- context "model_fields" do
6
-
7
- should "be an ActiveSupport::OrderedHash" do
8
- assert TypusUser.model_fields.instance_of?(ActiveSupport::OrderedHash)
9
- end
10
-
11
- should "verify TypusUser model_fields" do
12
- expected_fields = [[:id, :integer],
13
- [:first_name, :string],
14
- [:last_name, :string],
15
- [:role, :string],
16
- [:email, :string],
17
- [:status, :boolean],
18
- [:token, :string],
19
- [:salt, :string],
20
- [:crypted_password, :string],
21
- [:preferences, :string],
22
- [:created_at, :datetime],
23
- [:updated_at, :datetime]]
24
- assert_equal expected_fields.map { |i| i.first }, TypusUser.model_fields.keys
25
- assert_equal expected_fields.map { |i| i.last }, TypusUser.model_fields.values
26
- end
27
-
28
- should "verify Post model_fields" do
29
- expected_fields = [[:id, :integer],
30
- [:title, :string],
31
- [:body, :text],
32
- [:status, :string],
33
- [:favorite_comment_id, :integer],
34
- [:created_at, :datetime],
35
- [:updated_at, :datetime],
36
- [:published_at, :datetime],
37
- [:typus_user_id, :integer]]
38
- assert_equal expected_fields.map { |i| i.first }, Post.model_fields.keys
39
- assert_equal expected_fields.map { |i| i.last }, Post.model_fields.values
40
- end
41
-
42
- end
43
-
44
- context "model_relationships" do
45
-
46
- should "be an ActiveSupport::OrderedHash" do
47
- assert TypusUser.model_relationships.instance_of?(ActiveSupport::OrderedHash)
48
- end
49
-
50
- should "verify Post model_relationships" do
51
- expected = [[:comments, :has_many],
52
- [:categories, :has_and_belongs_to_many],
53
- [:user, nil],
54
- [:assets, :has_many]]
55
- expected.each do |i|
56
- assert_equal i.last, Post.model_relationships[i.first]
57
- end
58
- end
59
-
60
- end
61
-
62
- context "typus_description" do
63
-
64
- should "return the description of a model" do
65
- assert_equal "System Users Administration", TypusUser.typus_description
66
- end
67
-
68
- end
69
-
70
- context "typus_fields_for" do
71
-
72
- should "accept strings" do
73
- assert_equal %w( email role status ), TypusUser.typus_fields_for("list").keys
74
- end
75
-
76
- should "accept symbols" do
77
- assert_equal %w( email role status ), TypusUser.typus_fields_for(:list).keys
78
- end
79
-
80
- should "return list fields for TypusUser" do
81
- expected_fields = [["email", :string],
82
- ["role", :selector],
83
- ["status", :boolean]]
84
- assert_equal expected_fields.map { |i| i.first }, TypusUser.typus_fields_for(:list).keys
85
- assert_equal expected_fields.map { |i| i.last }, TypusUser.typus_fields_for(:list).values
86
- end
87
-
88
- should "return form fields for TypusUser" do
89
- expected_fields = [["first_name", :string],
90
- ["last_name", :string],
91
- ["role", :selector],
92
- ["email", :string],
93
- ["password", :password],
94
- ["password_confirmation", :password],
95
- ["language", :selector]]
96
- assert_equal expected_fields.map { |i| i.first }, TypusUser.typus_fields_for(:form).keys
97
- assert_equal expected_fields.map { |i| i.last }, TypusUser.typus_fields_for(:form).values
98
- end
99
-
100
- should "return form fields for Picture" do
101
- expected_fields = [["title", :string],
102
- ["picture", :file]]
103
- assert_equal expected_fields.map { |i| i.first }, Picture.typus_fields_for(:form).keys
104
- assert_equal expected_fields.map { |i| i.last }, Picture.typus_fields_for(:form).values
105
- end
106
-
107
- should "return form fields for a Model without configuration" do
108
- assert Class.new(ActiveRecord::Base).typus_fields_for(:form).empty?
109
- end
110
-
111
- should "return relationship fields for TypusUser" do
112
- assert_equal %w( first_name last_name role email language), TypusUser.typus_fields_for(:relationship).keys
113
- end
114
-
115
- should "return undefined fields for TypusUser" do
116
- assert_equal %w( first_name last_name role email language), TypusUser.typus_fields_for(:undefined).keys
117
- end
118
-
119
- end
120
-
121
- context "typus_filters" do
122
-
123
- should "return filters for TypusUser" do
124
- expected = [["status", :boolean], ["role", :string]]
125
-
126
- assert_equal expected.map { |i| i.first }.join(", "), Typus::Configuration.config["TypusUser"]["filters"]
127
- assert_equal expected.map { |i| i.first }, TypusUser.typus_filters.keys
128
- assert_equal expected.map { |i| i.last }, TypusUser.typus_filters.values
129
- end
130
-
131
- should "return filters for Post" do
132
- expected = [["status", :string], ["created_at", :datetime]]
133
- assert_equal expected.map { |i| i.first }.join(", "), Typus::Configuration.config["Post"]["filters"]
134
- assert_equal expected.map { |i| i.first }, Post.typus_filters.keys
135
- assert_equal expected.map { |i| i.last }, Post.typus_filters.values
136
- end
137
-
138
- end
139
-
140
- context "typus_actions_on" do
141
-
142
- should "accept strings" do
143
- assert_equal %w( cleanup ), Post.typus_actions_on("index")
144
- end
145
-
146
- should "accept symbols" do
147
- assert_equal %w( cleanup ), Post.typus_actions_on(:index)
148
- end
149
-
150
- should "return actions on list for TypusUser" do
151
- assert TypusUser.typus_actions_on(:list).empty?
152
- end
153
-
154
- should "return actions on edit for Post" do
155
- assert_equal %w( send_as_newsletter preview ), Post.typus_actions_on(:edit)
156
- end
157
-
158
- end
159
-
160
- context "typus_options_for" do
161
-
162
- should "accept strings" do
163
- assert_equal 15, Post.typus_options_for("form_rows")
164
- end
165
-
166
- should "accept symbols" do
167
- assert_equal 15, Post.typus_options_for(:form_rows)
168
- end
169
-
170
- should "return nil when options do not exist" do
171
- assert_nil TypusUser.typus_options_for(:unexisting)
172
- end
173
-
174
- should "return options for Post" do
175
- assert_equal 15, Post.typus_options_for(:form_rows)
176
- end
177
-
178
- should "return options for Page" do
179
- assert_equal 25, Page.typus_options_for(:form_rows)
180
- end
181
-
182
- end
183
-
184
- context "typus_application" do
185
-
186
- should "return application for Post" do
187
- assert_equal "Blog", Post.typus_application
188
- end
189
-
190
- should "return application for View" do
191
- assert_equal "Unknown", View.typus_application
192
- end
193
-
194
- end
195
-
196
- context "typus_field_options_for" do
197
-
198
- should "verify on models" do
199
- assert_equal [ :status ], Post.typus_field_options_for(:selectors)
200
- assert_equal [ :permalink ], Post.typus_field_options_for(:read_only)
201
- assert_equal [ :created_at ], Post.typus_field_options_for(:auto_generated)
202
- end
203
-
204
- end
205
-
206
- context "typus_boolean" do
207
-
208
- should "accept strings" do
209
- expected = {"Inactive"=>"false", "Active"=>"true"}
210
- assert_equal expected, TypusUser.typus_boolean("status")
211
- end
212
-
213
- should "accept symbols" do
214
- expected = {"Inactive"=>"false", "Active"=>"true"}
215
- assert_equal expected, TypusUser.typus_boolean(:status)
216
- end
217
-
218
- should "return booleans for TypusUser" do
219
- expected = {"Active" => "true", "Inactive" => "false"}
220
- assert_equal expected, TypusUser.typus_boolean(:status)
221
- end
222
-
223
- should "return booleans for Post" do
224
- expected = {"True" => "true", "False" => "false"}
225
- assert_equal expected, Post.typus_boolean(:status)
226
- end
227
-
228
- end
229
-
230
- context "typus_date_format" do
231
-
232
- should "accept strings" do
233
- assert_equal :db, Post.typus_date_format("unknown")
234
- end
235
-
236
- should "accept symbols" do
237
- assert_equal :db, Post.typus_date_format(:unknown)
238
- end
239
-
240
- should "return date_format for Post" do
241
- assert_equal :db, Post.typus_date_format
242
- assert_equal :post_short, Post.typus_date_format(:created_at)
243
- end
244
-
245
- end
246
-
247
- context "typus_template" do
248
-
249
- should "accept strings" do
250
- assert_equal "datepicker", Post.typus_template("published_at")
251
- end
252
-
253
- should "accept symbols" do
254
- assert_equal "datepicker", Post.typus_template(:published_at)
255
- end
256
-
257
- should "return nil if template does not exist" do
258
- assert_nil Post.typus_template(:created_at)
259
- end
260
-
261
- end
262
-
263
- context "typus_defaults_for" do
264
-
265
- should "accept strings" do
266
- assert_equal %w( title ), Post.typus_defaults_for("search")
267
- end
268
-
269
- should "accepts symbols" do
270
- assert_equal %w( title ), Post.typus_defaults_for(:search)
271
- end
272
-
273
- should "return default_for relationships on Post" do
274
- assert_equal %w( assets categories comments views ), Post.typus_defaults_for(:relationships)
275
- end
276
-
277
- end
278
-
279
- context "typus_search_fields" do
280
-
281
- should "return a hash with the search modifiers" do
282
- search = ["=id", "^title", "body"]
283
- Post.stubs(:typus_defaults_for).with(:search).returns(search)
284
- expected = {"body"=>"@", "title"=>"^", "id"=>"="}
285
- assert_equal expected, Post.typus_search_fields
286
- end
287
-
288
- should "return and empty hash" do
289
- search = []
290
- Post.stubs(:typus_defaults_for).with(:search).returns(search)
291
- expected = {}
292
- assert_equal expected, Post.typus_search_fields
293
- end
294
-
295
- end
296
-
297
- context "typus_export_formats" do
298
-
299
- should "return post formats" do
300
- assert_equal ["csv", "xml"], Post.typus_export_formats
301
- end
302
-
303
- should "return picture formats" do
304
- assert_equal [], Picture.typus_export_formats
305
- end
306
-
307
- end
308
-
309
- context "typus_order_by" do
310
-
311
- should "return defaults_for order_by on Post" do
312
- assert_equal "posts.title ASC, posts.created_at DESC", Post.typus_order_by
313
- assert_equal %w( title -created_at ), Post.typus_defaults_for(:order_by)
314
- end
315
-
316
- end
317
-
318
- context "build_conditions" do
319
-
320
- should "generate conditions for id" do
321
- Post.stubs(:typus_defaults_for).with(:search).returns(["id"])
322
-
323
- params = { :search => '1' }
324
- expected = "(id LIKE '%1%')"
325
-
326
- assert_equal expected, Post.build_conditions(params).first
327
- end
328
-
329
- should "generate conditions for fields starting with equal" do
330
- Post.stubs(:typus_defaults_for).with(:search).returns(["=id"])
331
-
332
- params = { :search => '1' }
333
- expected = "(id LIKE '1')"
334
-
335
- assert_equal expected, Post.build_conditions(params).first
336
- end
337
-
338
- should "generate conditions for fields starting with ^" do
339
- Post.stubs(:typus_defaults_for).with(:search).returns(["^id"])
340
-
341
- params = { :search => '1' }
342
- expected = "(id LIKE '1%')"
343
-
344
- assert_equal expected, Post.build_conditions(params).first
345
- end
346
-
347
- should "return_sql_conditions_on_search_for_typus_user" do
348
- expected = case ENV["DB"]
349
- when /postgresql/
350
- "(TEXT(role) LIKE '%francesc%' OR TEXT(last_name) LIKE '%francesc%' OR TEXT(email) LIKE '%francesc%' OR TEXT(first_name) LIKE '%francesc%')"
351
- else
352
- "(role LIKE '%francesc%' OR last_name LIKE '%francesc%' OR email LIKE '%francesc%' OR first_name LIKE '%francesc%')"
353
- end
354
-
355
- params = { :search => "francesc" }
356
- assert_equal expected, TypusUser.build_conditions(params).first
357
- params = { :search => "Francesc" }
358
- assert_equal expected, TypusUser.build_conditions(params).first
359
- end
360
-
361
- should "return_sql_conditions_on_search_and_filter_for_typus_user" do
362
- case ENV["DB"]
363
- when /mysql/
364
- boolean_true = "(`typus_users`.`status` = 1)"
365
- boolean_false = "(`typus_users`.`status` = 0)"
366
- else
367
- boolean_true = "(\"typus_users\".\"status\" = 't')"
368
- boolean_false = "(\"typus_users\".\"status\" = 'f')"
369
- end
370
-
371
- expected = "((role LIKE '%francesc%' OR last_name LIKE '%francesc%' OR email LIKE '%francesc%' OR first_name LIKE '%francesc%')) AND #{boolean_true}"
372
-
373
- params = { :search => "francesc", :status => "true" }
374
- assert_equal expected, TypusUser.build_conditions(params).first
375
- params = { :search => "francesc", :status => "false" }
376
- assert_match /#{boolean_false}/, TypusUser.build_conditions(params).first
377
- end
378
-
379
- should "return_sql_conditions_on_filtering_typus_users_by_status" do
380
- case ENV["DB"]
381
- when /mysql/
382
- boolean_true = "(`typus_users`.`status` = 1)"
383
- boolean_false = "(`typus_users`.`status` = 0)"
384
- else
385
- boolean_true = "(\"typus_users\".\"status\" = 't')"
386
- boolean_false = "(\"typus_users\".\"status\" = 'f')"
387
- end
388
-
389
- params = { :status => "true" }
390
- assert_equal boolean_true, TypusUser.build_conditions(params).first
391
- params = { :status => "false" }
392
- assert_equal boolean_false, TypusUser.build_conditions(params).first
393
- end
394
-
395
- should "return_sql_conditions_on_filtering_typus_users_by_created_at today" do
396
- expected = "(created_at BETWEEN '#{Time.zone.now.beginning_of_day.to_s(:db)}' AND '#{Time.zone.now.beginning_of_day.tomorrow.to_s(:db)}')"
397
- params = { :created_at => "today" }
398
- assert_equal expected, TypusUser.build_conditions(params).first
399
- end
400
-
401
- should "return_sql_conditions_on_filtering_typus_users_by_created_at last_few_days" do
402
- expected = "(created_at BETWEEN '#{3.days.ago.beginning_of_day.to_s(:db)}' AND '#{Time.zone.now.beginning_of_day.tomorrow.to_s(:db)}')"
403
- params = { :created_at => "last_few_days" }
404
- assert_equal expected, TypusUser.build_conditions(params).first
405
- end
406
-
407
- should "return_sql_conditions_on_filtering_typus_users_by_created_at last_7_days" do
408
- expected = "(created_at BETWEEN '#{6.days.ago.beginning_of_day.to_s(:db)}' AND '#{Time.zone.now.beginning_of_day.tomorrow.to_s(:db)}')"
409
- params = { :created_at => "last_7_days" }
410
- assert_equal expected, TypusUser.build_conditions(params).first
411
- end
412
-
413
- should "return_sql_conditions_on_filtering_typus_users_by_created_at last_30_days" do
414
- expected = "(created_at BETWEEN '#{Time.zone.now.beginning_of_day.prev_month.to_s(:db)}' AND '#{Time.zone.now.beginning_of_day.tomorrow.to_s(:db)}')"
415
- params = { :created_at => "last_30_days" }
416
- assert_equal expected, TypusUser.build_conditions(params).first
417
- end
418
-
419
- should "return_sql_conditions_on_filtering_posts_by_published_at today" do
420
- expected = "(published_at BETWEEN '#{Time.zone.now.beginning_of_day.to_s(:db)}' AND '#{Time.zone.now.beginning_of_day.tomorrow.to_s(:db)}')"
421
- params = { :published_at => "today" }
422
- assert_equal expected, Post.build_conditions(params).first
423
- end
424
-
425
- should "return_sql_conditions_on_filtering_posts_by_string" do
426
- expected = case ENV["DB"]
427
- when /mysql/
428
- "(`typus_users`.`role` = 'admin')"
429
- else
430
- "(\"typus_users\".\"role\" = 'admin')"
431
- end
432
-
433
- params = { :role => "admin" }
434
- assert_equal expected, TypusUser.build_conditions(params).first
435
- end
436
-
437
- end
438
-
439
- context "class_methods" do
440
-
441
- should "verify typus_user_id exists on Post" do
442
- assert Post.typus_user_id?
443
- end
444
-
445
- should "verify typus_user_id does not exist on Post" do
446
- assert !TypusUser.typus_user_id?
447
- end
448
-
449
- end
450
-
451
- end