trestle 0.9.0 → 0.9.8

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 (235) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +28 -0
  3. data/.gitignore +3 -0
  4. data/CONTRIBUTING.md +38 -0
  5. data/Gemfile +12 -5
  6. data/README.md +9 -2
  7. data/app/assets/bundle/trestle/bundle.css +9 -9
  8. data/app/assets/bundle/trestle/bundle.js +50 -48
  9. data/app/assets/bundle/trestle/fa-brands-400.eot +0 -0
  10. data/app/assets/bundle/trestle/fa-brands-400.svg +818 -597
  11. data/app/assets/bundle/trestle/fa-brands-400.ttf +0 -0
  12. data/app/assets/bundle/trestle/fa-brands-400.woff +0 -0
  13. data/app/assets/bundle/trestle/fa-brands-400.woff2 +0 -0
  14. data/app/assets/bundle/trestle/fa-regular-400.eot +0 -0
  15. data/app/assets/bundle/trestle/fa-regular-400.svg +93 -95
  16. data/app/assets/bundle/trestle/fa-regular-400.ttf +0 -0
  17. data/app/assets/bundle/trestle/fa-regular-400.woff +0 -0
  18. data/app/assets/bundle/trestle/fa-regular-400.woff2 +0 -0
  19. data/app/assets/bundle/trestle/fa-solid-900.eot +0 -0
  20. data/app/assets/bundle/trestle/fa-solid-900.svg +1209 -842
  21. data/app/assets/bundle/trestle/fa-solid-900.ttf +0 -0
  22. data/app/assets/bundle/trestle/fa-solid-900.woff +0 -0
  23. data/app/assets/bundle/trestle/fa-solid-900.woff2 +0 -0
  24. data/app/assets/bundle/trestle/flatpickr/ar-dz.js +1 -0
  25. data/app/assets/bundle/trestle/flatpickr/ar.js +1 -1
  26. data/app/assets/bundle/trestle/flatpickr/at.js +1 -1
  27. data/app/assets/bundle/trestle/flatpickr/az.js +1 -1
  28. data/app/assets/bundle/trestle/flatpickr/be.js +1 -1
  29. data/app/assets/bundle/trestle/flatpickr/bg.js +1 -1
  30. data/app/assets/bundle/trestle/flatpickr/bn.js +1 -1
  31. data/app/assets/bundle/trestle/flatpickr/bs.js +1 -1
  32. data/app/assets/bundle/trestle/flatpickr/cat.js +1 -1
  33. data/app/assets/bundle/trestle/flatpickr/ckb.js +1 -0
  34. data/app/assets/bundle/trestle/flatpickr/cs.js +1 -1
  35. data/app/assets/bundle/trestle/flatpickr/cy.js +1 -1
  36. data/app/assets/bundle/trestle/flatpickr/da.js +1 -1
  37. data/app/assets/bundle/trestle/flatpickr/de.js +1 -1
  38. data/app/assets/bundle/trestle/flatpickr/default.js +1 -1
  39. data/app/assets/bundle/trestle/flatpickr/eo.js +1 -1
  40. data/app/assets/bundle/trestle/flatpickr/es.js +1 -1
  41. data/app/assets/bundle/trestle/flatpickr/et.js +1 -1
  42. data/app/assets/bundle/trestle/flatpickr/fa.js +1 -1
  43. data/app/assets/bundle/trestle/flatpickr/fi.js +1 -1
  44. data/app/assets/bundle/trestle/flatpickr/fo.js +1 -1
  45. data/app/assets/bundle/trestle/flatpickr/fr.js +1 -1
  46. data/app/assets/bundle/trestle/flatpickr/ga.js +1 -1
  47. data/app/assets/bundle/trestle/flatpickr/gr.js +1 -1
  48. data/app/assets/bundle/trestle/flatpickr/he.js +1 -1
  49. data/app/assets/bundle/trestle/flatpickr/hi.js +1 -1
  50. data/app/assets/bundle/trestle/flatpickr/hr.js +1 -1
  51. data/app/assets/bundle/trestle/flatpickr/hu.js +1 -1
  52. data/app/assets/bundle/trestle/flatpickr/hy.js +1 -0
  53. data/app/assets/bundle/trestle/flatpickr/id.js +1 -1
  54. data/app/assets/bundle/trestle/flatpickr/is.js +1 -1
  55. data/app/assets/bundle/trestle/flatpickr/it.js +1 -1
  56. data/app/assets/bundle/trestle/flatpickr/ja.js +1 -1
  57. data/app/assets/bundle/trestle/flatpickr/ka.js +1 -1
  58. data/app/assets/bundle/trestle/flatpickr/km.js +1 -1
  59. data/app/assets/bundle/trestle/flatpickr/ko.js +1 -1
  60. data/app/assets/bundle/trestle/flatpickr/kz.js +1 -1
  61. data/app/assets/bundle/trestle/flatpickr/lt.js +1 -1
  62. data/app/assets/bundle/trestle/flatpickr/lv.js +1 -1
  63. data/app/assets/bundle/trestle/flatpickr/mk.js +1 -1
  64. data/app/assets/bundle/trestle/flatpickr/mn.js +1 -1
  65. data/app/assets/bundle/trestle/flatpickr/ms.js +1 -1
  66. data/app/assets/bundle/trestle/flatpickr/my.js +1 -1
  67. data/app/assets/bundle/trestle/flatpickr/nl.js +1 -1
  68. data/app/assets/bundle/trestle/flatpickr/nn.js +1 -0
  69. data/app/assets/bundle/trestle/flatpickr/no.js +1 -1
  70. data/app/assets/bundle/trestle/flatpickr/pa.js +1 -1
  71. data/app/assets/bundle/trestle/flatpickr/pl.js +1 -1
  72. data/app/assets/bundle/trestle/flatpickr/pt.js +1 -1
  73. data/app/assets/bundle/trestle/flatpickr/ro.js +1 -1
  74. data/app/assets/bundle/trestle/flatpickr/ru.js +1 -1
  75. data/app/assets/bundle/trestle/flatpickr/si.js +1 -1
  76. data/app/assets/bundle/trestle/flatpickr/sk.js +1 -1
  77. data/app/assets/bundle/trestle/flatpickr/sl.js +1 -1
  78. data/app/assets/bundle/trestle/flatpickr/sq.js +1 -1
  79. data/app/assets/bundle/trestle/flatpickr/sr-cyr.js +1 -1
  80. data/app/assets/bundle/trestle/flatpickr/sr.js +1 -1
  81. data/app/assets/bundle/trestle/flatpickr/sv.js +1 -1
  82. data/app/assets/bundle/trestle/flatpickr/th.js +1 -1
  83. data/app/assets/bundle/trestle/flatpickr/tr.js +1 -1
  84. data/app/assets/bundle/trestle/flatpickr/uk.js +1 -1
  85. data/app/assets/bundle/trestle/flatpickr/uz.js +1 -0
  86. data/app/assets/bundle/trestle/flatpickr/uz_latn.js +1 -0
  87. data/app/assets/bundle/trestle/flatpickr/vn.js +1 -1
  88. data/app/assets/bundle/trestle/flatpickr/zh-tw.js +1 -1
  89. data/app/assets/bundle/trestle/flatpickr/zh.js +1 -1
  90. data/app/assets/javascripts/trestle/admin.js +1 -0
  91. data/app/assets/javascripts/trestle/i18n.js.erb +8 -0
  92. data/{lib → app/controllers/concerns}/trestle/controller/breadcrumbs.rb +1 -1
  93. data/app/controllers/concerns/trestle/controller/title.rb +20 -0
  94. data/app/controllers/concerns/trestle/controller/toolbars.rb +30 -0
  95. data/app/controllers/concerns/trestle/resource/controller/actions.rb +133 -0
  96. data/app/controllers/concerns/trestle/resource/controller/data_methods.rb +52 -0
  97. data/app/controllers/concerns/trestle/resource/controller/redirection.rb +23 -0
  98. data/app/controllers/concerns/trestle/resource/controller/toolbar.rb +11 -0
  99. data/app/controllers/trestle/admin_controller.rb +31 -0
  100. data/app/controllers/trestle/application_controller.rb +12 -0
  101. data/app/controllers/trestle/dashboard_controller.rb +2 -2
  102. data/app/controllers/trestle/resource_controller.rb +6 -0
  103. data/app/helpers/trestle/avatar_helper.rb +6 -2
  104. data/app/helpers/trestle/container_helper.rb +12 -4
  105. data/app/helpers/trestle/grid_helper.rb +51 -7
  106. data/app/helpers/trestle/hook_helper.rb +1 -25
  107. data/app/helpers/trestle/i18n_helper.rb +8 -15
  108. data/app/helpers/trestle/layout_helper.rb +20 -0
  109. data/app/helpers/trestle/navigation_helper.rb +23 -0
  110. data/app/helpers/trestle/params_helper.rb +4 -1
  111. data/app/helpers/trestle/table_helper.rb +22 -3
  112. data/app/helpers/trestle/title_helper.rb +11 -0
  113. data/app/helpers/trestle/toolbars_helper.rb +0 -11
  114. data/app/helpers/trestle/url_helper.rb +1 -11
  115. data/app/views/layouts/trestle/admin.html.erb +6 -6
  116. data/app/views/trestle/application/_dialog.html.erb +1 -1
  117. data/app/views/trestle/application/_header.html.erb +1 -3
  118. data/app/views/trestle/flash/_alert.html.erb +3 -1
  119. data/app/views/trestle/flash/_debug.html.erb +13 -8
  120. data/app/views/trestle/flash/_flash.html.erb +1 -1
  121. data/app/views/trestle/resource/_scopes.html.erb +17 -8
  122. data/app/views/trestle/resource/edit.html.erb +2 -2
  123. data/app/views/trestle/resource/index.html.erb +3 -3
  124. data/app/views/trestle/resource/new.html.erb +1 -1
  125. data/app/views/trestle/resource/show.html.erb +2 -2
  126. data/app/views/trestle/shared/_sidebar.html.erb +5 -6
  127. data/app/views/trestle/table/_pagination.html.erb +1 -1
  128. data/config/locales/de.rb +18 -0
  129. data/config/locales/de.yml +101 -0
  130. data/config/locales/vi.rb +18 -0
  131. data/config/locales/vi.yml +101 -0
  132. data/config/routes.rb +1 -1
  133. data/frontend/css/components/_alerts.scss +31 -0
  134. data/frontend/css/components/_avatar.scss +14 -0
  135. data/frontend/css/components/_buttons.scss +0 -1
  136. data/frontend/css/components/_datepicker.scss +1 -0
  137. data/frontend/css/components/_fields.scss +6 -0
  138. data/frontend/css/components/_modal.scss +2 -0
  139. data/frontend/css/components/_scopes.scss +66 -21
  140. data/frontend/css/components/_table.scss +20 -0
  141. data/frontend/css/components/_tags.scss +2 -0
  142. data/frontend/css/components/_timestamp.scss +1 -1
  143. data/frontend/css/layout/_content.scss +5 -2
  144. data/frontend/css/layout/_sidebar.scss +9 -3
  145. data/frontend/css/variables/_bootstrap.scss +1 -0
  146. data/frontend/css/variables/_trestle.scss +25 -5
  147. data/frontend/js/components/confirmation.js +4 -2
  148. data/frontend/js/components/dialog.js +15 -4
  149. data/frontend/js/components/form.js +9 -0
  150. data/frontend/js/components/navigation.js +63 -0
  151. data/frontend/js/components/pagination.js +51 -0
  152. data/frontend/js/components/sidebar.js +8 -11
  153. data/frontend/js/components/table.js +33 -2
  154. data/frontend/js/components/tabs.js +3 -3
  155. data/frontend/js/core/events.js +7 -3
  156. data/frontend/js/index.js +1 -0
  157. data/frontend/theme/trestle/theme/_defaults.scss +4 -4
  158. data/frontend/theme/trestle/theme/bootstrap/_buttons.scss +3 -0
  159. data/lib/generators/trestle/install/install_generator.rb +6 -2
  160. data/lib/generators/trestle/install/templates/_custom.css +8 -0
  161. data/lib/generators/trestle/install/templates/_theme.scss +1 -1
  162. data/lib/generators/trestle/install/templates/trestle.rb.erb +8 -2
  163. data/lib/generators/trestle/resource/resource_generator.rb +15 -1
  164. data/lib/generators/trestle/resource/templates/admin.rb.erb +15 -8
  165. data/lib/trestle/adapters/active_record_adapter.rb +17 -1
  166. data/lib/trestle/adapters.rb +1 -1
  167. data/lib/trestle/admin/builder.rb +7 -3
  168. data/lib/trestle/admin.rb +18 -8
  169. data/lib/trestle/configurable.rb +16 -0
  170. data/lib/trestle/configuration.rb +7 -8
  171. data/lib/trestle/debug_errors.rb +24 -0
  172. data/lib/trestle/engine.rb +3 -10
  173. data/lib/trestle/evaluation_context.rb +11 -3
  174. data/lib/trestle/form/automatic.rb +4 -2
  175. data/lib/trestle/form/builder.rb +6 -7
  176. data/lib/trestle/form/field.rb +44 -17
  177. data/lib/trestle/form/fields/check_box_helpers.rb +1 -1
  178. data/lib/trestle/form/fields/collection_select.rb +1 -1
  179. data/lib/trestle/form/fields/date_picker.rb +9 -3
  180. data/lib/trestle/form/fields/date_select.rb +1 -1
  181. data/lib/trestle/form/fields/datetime_select.rb +1 -1
  182. data/lib/trestle/form/fields/file_field.rb +1 -1
  183. data/lib/trestle/form/fields/form_group.rb +18 -5
  184. data/lib/trestle/form/fields/grouped_collection_select.rb +1 -1
  185. data/lib/trestle/form/fields/range_field.rb +2 -4
  186. data/lib/trestle/form/fields/select.rb +2 -3
  187. data/lib/trestle/form/fields/static_field.rb +7 -3
  188. data/lib/trestle/form/fields/tag_select.rb +3 -1
  189. data/lib/trestle/form/fields/time_select.rb +1 -1
  190. data/lib/trestle/form/fields/time_zone_select.rb +1 -1
  191. data/lib/trestle/form/fields.rb +6 -38
  192. data/lib/trestle/form/renderer.rb +11 -4
  193. data/lib/trestle/form.rb +5 -7
  194. data/lib/trestle/hook/helpers.rb +33 -0
  195. data/lib/trestle/hook/set.rb +32 -0
  196. data/lib/trestle/hook.rb +5 -31
  197. data/lib/trestle/lazy.rb +56 -0
  198. data/lib/trestle/navigation/group.rb +5 -2
  199. data/lib/trestle/navigation/item.rb +7 -3
  200. data/lib/trestle/navigation.rb +3 -6
  201. data/lib/trestle/registry.rb +61 -0
  202. data/lib/trestle/reloader.rb +24 -12
  203. data/lib/trestle/resource/builder.rb +4 -3
  204. data/lib/trestle/resource/collection.rb +1 -5
  205. data/lib/trestle/resource/toolbar.rb +42 -0
  206. data/lib/trestle/resource.rb +8 -9
  207. data/lib/trestle/scopes/block.rb +9 -8
  208. data/lib/trestle/scopes/definition.rb +22 -0
  209. data/lib/trestle/scopes/scope.rb +6 -2
  210. data/lib/trestle/scopes.rb +38 -11
  211. data/lib/trestle/tab.rb +2 -0
  212. data/lib/trestle/table/actions_column.rb +6 -6
  213. data/lib/trestle/table/automatic.rb +10 -3
  214. data/lib/trestle/table/builder.rb +4 -4
  215. data/lib/trestle/table/column.rb +34 -25
  216. data/lib/trestle/table/row.rb +13 -13
  217. data/lib/trestle/table/select_column.rb +19 -7
  218. data/lib/trestle/table.rb +17 -12
  219. data/lib/trestle/toolbar.rb +4 -11
  220. data/lib/trestle/version.rb +1 -1
  221. data/lib/trestle.rb +62 -48
  222. data/package.json +21 -24
  223. data/trestle.gemspec +6 -6
  224. data/webpack.config.js +40 -49
  225. data/yarn.lock +3044 -4730
  226. metadata +66 -22
  227. data/.travis.yml +0 -27
  228. data/lib/trestle/admin/controller.rb +0 -28
  229. data/lib/trestle/application_controller.rb +0 -12
  230. data/lib/trestle/resource/controller.rb +0 -174
  231. /data/{lib → app/controllers/concerns}/trestle/controller/callbacks.rb +0 -0
  232. /data/{lib → app/controllers/concerns}/trestle/controller/dialog.rb +0 -0
  233. /data/{lib → app/controllers/concerns}/trestle/controller/helpers.rb +0 -0
  234. /data/{lib → app/controllers/concerns}/trestle/controller/layout.rb +0 -0
  235. /data/{lib → app/controllers/concerns}/trestle/controller/location.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3cdfde7b217d044ec9cfa2792d0ce3eb85ee4e36ca9e91da68c45badf94ec9a
4
- data.tar.gz: a774edd80c3bacf623615285aff172b042de6cdaf81617149bd9707be5cee767
3
+ metadata.gz: e8a9b6c1f4d2b83d9257ed2daa7c2bf4e4a66afd73bda0a56a26663ced8cc9b6
4
+ data.tar.gz: 5ecb674467604a6b4ce4d26a77645439f31b0b6b60ac1bf8f2e9770e054056e3
5
5
  SHA512:
6
- metadata.gz: bf9890c72d39514f4d8133054098d63d4e8fad36bc88c287a58853c77fd814a328538b88d13f30ee9112df6ed31359efcac96cbd0ffc88221cf391350d3859f3
7
- data.tar.gz: 670a009ba4de473a84d2b9570bca583d15ae76ea48d90b5fb72b7bc3df08ff9fa64c555aa171539e7cd234cc9ea29f33340569a168d5917d13b9211a969e81ad
6
+ metadata.gz: 5895c063366491326c7b736d92afa03298a5b0afbf3fa231986599dec66a2fd9286588a0d4d473e281f9d2977e2a4cb0b2dc3fe99b3d16bd698560f83e8e4887
7
+ data.tar.gz: e6756a7feab92d97744fdf4d460c5ddb22d3c5b8011c993e2c457bf6e60544ca77a8daf0c0edb56226514978a85f91c7905089c862ee454552b4068bdb4048e2
@@ -0,0 +1,28 @@
1
+ name: RSpec
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ strategy:
8
+ fail-fast: false
9
+ matrix:
10
+ gemfile: [ rails-5.0, rails-5.1, rails-5.2, rails-6.0, rails-6.1 ]
11
+ ruby: [ '2.7' ]
12
+ include:
13
+ - gemfile: rails-6.1
14
+ ruby: '3.0'
15
+ - gemfile: rails-7.0
16
+ ruby: '2.7'
17
+ - gemfile: rails-7.0
18
+ ruby: '3.0'
19
+ runs-on: ubuntu-latest
20
+ env:
21
+ BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
22
+ steps:
23
+ - uses: actions/checkout@v3
24
+ - uses: ruby/setup-ruby@v1
25
+ with:
26
+ ruby-version: ${{ matrix.ruby }}
27
+ bundler-cache: true
28
+ - run: bundle exec rake
data/.gitignore CHANGED
@@ -16,4 +16,7 @@
16
16
  /spec/dummy/*.sqlite3-journal
17
17
  /spec/dummy/log/*.log
18
18
  /spec/dummy/tmp/*
19
+ /spec/dummy/config/credentials.yml.enc
20
+ /spec/dummy/config/master.key
21
+ /spec/dummy/public/assets/
19
22
  /node_modules
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,38 @@
1
+ # Contributing to Trestle
2
+
3
+ ## Table of Contents
4
+
5
+ 1. [Running the Test Suite](#running-the-test-suite)
6
+ 2. [Sandbox Application](#sandbox-application)
7
+ 3. [Contributor License Agreement](#contributor-license-agreement)
8
+
9
+
10
+ ## Running the Test Suite
11
+
12
+ After checking out the repository and installing dependencies by running `bundle`, the full RSpec test suite can be run with:
13
+
14
+ ```sh
15
+ $ bundle exec rake
16
+ ```
17
+
18
+ When submitting a pull request, please ensure that all of the tests are passing. Builds will be automatically checked for a passing test suite by [GitHub Actions](https://github.com/TrestleAdmin/trestle/actions).
19
+
20
+
21
+ ## Sandbox Application
22
+
23
+ The Trestle repo includes a sandbox application with some example admins and pages to demo most of the available functionality.
24
+
25
+ The following commands will set up the database (including sample seed data) and start a rails server:
26
+
27
+ ```sh
28
+ $ cd sandbox
29
+ $ bundle exec rails db:setup
30
+ $ bundle exec rails server
31
+ ```
32
+
33
+ You can then browse to http://localhost:3000/admin to access the sandbox.
34
+
35
+
36
+ ## Contributor License Agreement
37
+
38
+ We ask that all contributors please sign the [Contributor License Agreement](https://cla-assistant.io/TrestleAdmin/trestle). If you have not previously signed the agreement, you will be prompted to when creating your first pull request.
data/Gemfile CHANGED
@@ -1,20 +1,27 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in trestle.gemspec
4
- gemspec
3
+ group :development do
4
+ gem 'bcrypt'
5
+ gem 'faker'
6
+ end
5
7
 
6
8
  group :test do
7
- gem 'coveralls', require: false
8
- gem 'simplecov', require: false
9
- gem 'guard-rspec', require: false
9
+ gem 'coveralls_reborn', require: false
10
+ gem 'guard-rspec', require: false
10
11
 
11
12
  gem 'capybara'
12
13
  gem 'capybara-selenium'
14
+ gem 'rexml'
13
15
  gem 'selenium-webdriver'
14
16
  gem 'webdrivers'
15
17
  gem 'puma'
18
+ gem 'launchy'
19
+ gem 'capybara-screenshot'
16
20
  end
17
21
 
18
22
  gem 'haml'
19
23
  gem 'sassc-rails'
20
24
  gem 'sqlite3', '~> 1.4'
25
+
26
+ # Specify your gem's dependencies in trestle.gemspec
27
+ gemspec
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  # Trestle
6
6
 
7
7
  [![RubyGem](https://img.shields.io/gem/v/trestle.svg?style=flat&colorB=4065a9)](https://rubygems.org/gems/trestle)
8
- [![Travis](https://img.shields.io/travis/TrestleAdmin/trestle.svg?style=flat)](https://travis-ci.org/TrestleAdmin/trestle)
8
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/TrestleAdmin/trestle/rspec.yml?style=flat)](https://github.com/TrestleAdmin/trestle/actions)
9
9
  [![Coveralls](https://img.shields.io/coveralls/TrestleAdmin/trestle.svg?style=flat)](https://coveralls.io/github/TrestleAdmin/trestle)
10
10
  [![Code Climate](https://api.codeclimate.com/v1/badges/c529a7a9c500ed81baed/maintainability)](https://codeclimate.com/github/TrestleAdmin/trestle)
11
11
 
@@ -28,7 +28,7 @@ Run `bundle install`, and then run the install generator to create the initial c
28
28
 
29
29
  $ rails generate trestle:install
30
30
 
31
- Then create your first admin resource:
31
+ Then create your first admin resource (assuming you have an existing `Article` model):
32
32
 
33
33
  $ rails generate trestle:resource Article
34
34
 
@@ -104,6 +104,13 @@ The following plugins are currently available:
104
104
  | *trestle-sidekiq* | [Sidekiq](http://sidekiq.org/) integration | [GitHub](https://github.com/TrestleAdmin/trestle-sidekiq) \| [RubyGems](https://rubygems.org/gems/trestle-sidekiq) |
105
105
  | *trestle-active_storage* | [Active Storage](https://guides.rubyonrails.org/active_storage_overview.html) integration | [GitHub](https://github.com/richardvenneman/trestle-active_storage) \| [RubyGems](https://rubygems.org/gems/trestle-active_storage) |
106
106
  | *trestle-mobility* | [Mobility](https://github.com/shioyama/mobility) integration | [GitHub](https://github.com/richardvenneman/trestle-mobility) \| [RubyGems](https://rubygems.org/gems/trestle-mobility) |
107
+ | *trestle-omniauth* | OmniAuth authentication plugin | [GitHub](https://github.com/airhorns/trestle-omniauth) \| [RubyGems](https://rubygems.org/gems/trestle-omniauth) |
108
+ | *trestle-auth-otp* | 2FA/OTP user authentication | [GitHub](https://github.com/McRipper/trestle-auth-otp) \| [RubyGems](https://rubygems.org/gems/trestle-auth-otp) |
109
+
110
+
111
+ ## Development
112
+
113
+ Please see [CONTRIBUTING.md](CONTRIBUTING.md) for information on developing and contributing to Trestle.
107
114
 
108
115
 
109
116
  ## License