message_train 0.7.5 → 1.0.0

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 (171) hide show
  1. checksums.yaml +5 -5
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/ci.yml +86 -0
  4. data/.gitignore +64 -0
  5. data/.rubocop.yml +9 -0
  6. data/.rubocop_todo.yml +854 -2
  7. data/.ruby-version +1 -1
  8. data/.simplecov +2 -4
  9. data/CHANGELOG.md +128 -0
  10. data/CLAUDE.md +5 -0
  11. data/Gemfile +30 -32
  12. data/LICENSE.txt +1 -1
  13. data/README.md +106 -35
  14. data/Rakefile +4 -18
  15. data/app/assets/stylesheets/message_train.scss +405 -67
  16. data/app/controllers/concerns/message_train_support.rb +2 -2
  17. data/app/controllers/message_train/boxes_controller.rb +4 -2
  18. data/app/controllers/message_train/conversations_controller.rb +1 -0
  19. data/app/helpers/message_train/application_helper.rb +68 -0
  20. data/app/helpers/message_train/attachments_helper.rb +7 -4
  21. data/app/helpers/message_train/conversations_helper.rb +16 -16
  22. data/app/helpers/message_train/messages_helper.rb +23 -10
  23. data/app/javascript/controllers/message_train/bulk_actions_controller.js +36 -0
  24. data/app/javascript/controllers/message_train/lightbox_controller.js +25 -0
  25. data/app/javascript/controllers/message_train/nested_form_controller.js +36 -0
  26. data/app/javascript/controllers/message_train/recipient_autocomplete_controller.js +31 -0
  27. data/app/mailers/message_train/previews/receipt_mailer_preview.rb +7 -5
  28. data/app/models/message_train/attachment.rb +54 -42
  29. data/app/models/message_train/box.rb +2 -2
  30. data/app/models/message_train/conversation.rb +28 -2
  31. data/app/models/message_train/ignore.rb +2 -2
  32. data/app/models/message_train/message.rb +10 -4
  33. data/app/models/message_train/receipt.rb +27 -4
  34. data/app/models/message_train/unsubscribe.rb +1 -1
  35. data/app/views/application/404.html.haml +1 -3
  36. data/app/views/kaminari/_first_page.html.haml +1 -1
  37. data/app/views/kaminari/_last_page.html.haml +1 -1
  38. data/app/views/kaminari/_next_page.html.haml +1 -1
  39. data/app/views/kaminari/_page.html.haml +3 -3
  40. data/app/views/kaminari/_paginator.html.haml +12 -11
  41. data/app/views/kaminari/_prev_page.html.haml +1 -1
  42. data/app/views/message_train/application/_attachment_fields.html.haml +10 -7
  43. data/app/views/message_train/application/_attachment_link.html.haml +2 -2
  44. data/app/views/message_train/application/_widget.html.haml +2 -4
  45. data/app/views/message_train/boxes/_widget.html.haml +5 -5
  46. data/app/views/message_train/boxes/show.html.haml +28 -45
  47. data/app/views/message_train/collectives/_widget.html.haml +4 -4
  48. data/app/views/message_train/conversations/_conversation.html.haml +11 -11
  49. data/app/views/message_train/conversations/_deleted_toggle.html.haml +1 -1
  50. data/app/views/message_train/conversations/_ignored_toggle.html.haml +2 -2
  51. data/app/views/message_train/conversations/_read_toggle.html.haml +2 -2
  52. data/app/views/message_train/conversations/_toggle.html.haml +6 -4
  53. data/app/views/message_train/conversations/_trashed_toggle.html.haml +2 -2
  54. data/app/views/message_train/conversations/show.html.haml +8 -6
  55. data/app/views/message_train/messages/_deleted_toggle.html.haml +1 -1
  56. data/app/views/message_train/messages/_form.html.haml +22 -30
  57. data/app/views/message_train/messages/_message.html.haml +27 -45
  58. data/app/views/message_train/messages/_read_toggle.html.haml +2 -2
  59. data/app/views/message_train/messages/_toggle.html.haml +5 -1
  60. data/app/views/message_train/messages/_trashed_toggle.html.haml +2 -2
  61. data/app/views/message_train/unsubscribes/index.html.haml +12 -15
  62. data/badges/coverage.json +1 -0
  63. data/config/importmap.rb +2 -0
  64. data/config/locales/en.yml +6 -3
  65. data/db/migrate/20150721145319_create_message_train_conversations.rb +1 -1
  66. data/db/migrate/20150721160322_create_message_train_messages.rb +1 -1
  67. data/db/migrate/20150721161144_create_message_train_attachments.rb +5 -2
  68. data/db/migrate/20150721161940_create_message_train_receipts.rb +1 -1
  69. data/db/migrate/20150721163838_create_message_train_ignores.rb +1 -1
  70. data/db/migrate/20150901183458_add_received_through_to_message_train_receipts.rb +1 -1
  71. data/db/migrate/20151004184347_add_unique_index_to_receipts.rb +1 -1
  72. data/db/migrate/20151124000820_create_message_train_unsubscribes.rb +1 -1
  73. data/db/migrate/20260827095938_remove_paperclip_columns_from_message_train_attachments.rb +8 -0
  74. data/db/migrate/20260827171549_remove_body_from_message_train_messages.rb +5 -0
  75. data/db/migrate/20260827180000_add_marking_indexes.rb +9 -0
  76. data/db/migrate/20260827200000_add_body_back_to_message_train_messages.rb +5 -0
  77. data/docs/screenshots/inbox-desktop.png +0 -0
  78. data/docs/screenshots/inbox-mobile.png +0 -0
  79. data/lib/generators/message_train/install/install_generator.rb +1 -1
  80. data/lib/message_train/engine.rb +11 -0
  81. data/lib/message_train/instance_methods.rb +13 -7
  82. data/lib/message_train/localization.rb +4 -3
  83. data/lib/message_train/version.rb +1 -1
  84. data/lib/message_train.rb +0 -2
  85. data/message_train.gemspec +57 -389
  86. data/spec/controllers/message_train/boxes_controller_spec.rb +13 -8
  87. data/spec/controllers/message_train/concerns_spec.rb +2 -2
  88. data/spec/controllers/message_train/conversations_controller_spec.rb +36 -7
  89. data/spec/controllers/message_train/messages_controller_spec.rb +4 -4
  90. data/spec/dummy/app/assets/stylesheets/application.scss +141 -12
  91. data/spec/dummy/app/controllers/application_controller.rb +1 -1
  92. data/spec/dummy/app/javascript/application.js +4 -0
  93. data/spec/dummy/app/javascript/controllers/application.js +9 -0
  94. data/spec/dummy/app/javascript/controllers/index.js +4 -0
  95. data/spec/dummy/app/models/role.rb +1 -1
  96. data/spec/dummy/app/views/active_storage/blobs/_blob.html.erb +14 -0
  97. data/spec/dummy/app/views/layouts/_top_navigation.html.haml +18 -7
  98. data/spec/dummy/app/views/layouts/application.html.haml +22 -26
  99. data/spec/dummy/bin/importmap +4 -0
  100. data/spec/dummy/config/application.rb +7 -20
  101. data/spec/dummy/config/environments/development.rb +17 -21
  102. data/spec/dummy/config/environments/production.rb +11 -63
  103. data/spec/dummy/config/environments/test.rb +21 -16
  104. data/spec/dummy/config/importmap.rb +7 -0
  105. data/spec/dummy/config/initializers/assets.rb +1 -6
  106. data/spec/dummy/config/routes.rb +1 -1
  107. data/spec/dummy/config/storage.yml +7 -0
  108. data/spec/dummy/db/migrate/20150721140013_devise_create_users.rb +1 -1
  109. data/spec/dummy/db/migrate/20150721141009_rolify_create_roles.rb +1 -1
  110. data/spec/dummy/db/migrate/20150721141128_create_groups.rb +1 -1
  111. data/spec/dummy/db/migrate/20150721150307_add_display_name_column_to_users.rb +1 -1
  112. data/spec/dummy/db/migrate/20160207190402_create_message_train_conversations.message_train.rb +1 -1
  113. data/spec/dummy/db/migrate/20160207190403_create_message_train_messages.message_train.rb +1 -1
  114. data/spec/dummy/db/migrate/20160207190404_create_message_train_attachments.message_train.rb +5 -2
  115. data/spec/dummy/db/migrate/20160207190405_create_message_train_receipts.message_train.rb +1 -1
  116. data/spec/dummy/db/migrate/20160207190406_create_message_train_ignores.message_train.rb +1 -1
  117. data/spec/dummy/db/migrate/20160207190407_add_received_through_to_message_train_receipts.message_train.rb +1 -1
  118. data/spec/dummy/db/migrate/20160207190408_add_unique_index_to_receipts.message_train.rb +1 -1
  119. data/spec/dummy/db/migrate/20160207190409_create_message_train_unsubscribes.message_train.rb +1 -1
  120. data/spec/dummy/db/migrate/20260827095939_remove_paperclip_columns_from_message_train_attachments.message_train.rb +9 -0
  121. data/spec/dummy/db/migrate/20260827161141_create_active_storage_tables.active_storage.rb +57 -0
  122. data/spec/dummy/db/migrate/20260827171550_remove_body_from_message_train_messages.message_train.rb +6 -0
  123. data/spec/dummy/db/migrate/20260827225116_add_marking_indexes.message_train.rb +10 -0
  124. data/spec/dummy/db/migrate/20260828034830_add_body_back_to_message_train_messages.message_train.rb +6 -0
  125. data/spec/dummy/db/migrate/20260828040000_drop_action_text_tables.rb +5 -0
  126. data/spec/dummy/db/schema.rb +106 -72
  127. data/spec/dummy/db/seeds/conversations.seeds.rb +22 -22
  128. data/spec/dummy/db/seeds/development/conversations.seeds.rb +2 -2
  129. data/spec/dummy/db/seeds/groups.seeds.rb +4 -4
  130. data/spec/dummy/db/seeds/test/attachments.seeds.rb +4 -4
  131. data/spec/dummy/db/seeds/test/conversations.seeds.rb +2 -2
  132. data/spec/dummy/db/seeds/users.seeds.rb +8 -8
  133. data/spec/dummy/vendor/javascript/.keep +0 -0
  134. data/spec/factories/attachment.rb +5 -6
  135. data/spec/factories/group.rb +2 -2
  136. data/spec/factories/message.rb +7 -7
  137. data/spec/factories/user.rb +3 -3
  138. data/spec/features/boxes_spec.rb +38 -34
  139. data/spec/features/conversations_spec.rb +13 -6
  140. data/spec/features/messages_spec.rb +20 -20
  141. data/spec/features/unsubscribes_spec.rb +9 -9
  142. data/spec/helpers/message_train/application_helper_spec.rb +16 -18
  143. data/spec/helpers/message_train/attachment_helper_spec.rb +8 -18
  144. data/spec/helpers/message_train/boxes_helper_spec.rb +6 -6
  145. data/spec/helpers/message_train/collectives_helper_spec.rb +10 -10
  146. data/spec/helpers/message_train/conversations_helper_spec.rb +43 -85
  147. data/spec/helpers/message_train/messages_helper_spec.rb +41 -61
  148. data/spec/models/message_train/attachment_spec.rb +26 -36
  149. data/spec/models/message_train/box_spec.rb +2 -2
  150. data/spec/models/message_train/conversation_spec.rb +15 -0
  151. data/spec/models/message_train/message_spec.rb +5 -1
  152. data/spec/models/message_train/receipt_spec.rb +1 -1
  153. data/spec/models/message_train/unsubscribe_spec.rb +1 -1
  154. data/spec/rails_helper.rb +14 -13
  155. data/spec/support/controller_behaviors.rb +13 -13
  156. data/spec/support/factory_bot.rb +3 -0
  157. data/spec/support/feature_behaviors.rb +14 -14
  158. data/spec/support/loaded_site/attachments.rb +6 -2
  159. data/spec/support/utilities.rb +49 -20
  160. metadata +260 -189
  161. data/.travis.yml +0 -12
  162. data/VERSION +0 -1
  163. data/app/assets/javascripts/ckeditor/config.js +0 -49
  164. data/app/assets/javascripts/message_train.js +0 -149
  165. data/spec/dummy/app/assets/javascripts/application.js +0 -17
  166. data/spec/dummy/app/assets/stylesheets/bootstrap-everything.scss +0 -54
  167. data/spec/dummy/config/initializers/bootstrap_leather.rb +0 -7
  168. data/spec/dummy/config/initializers/paperclip.rb +0 -5
  169. data/spec/dummy/config/secrets.yml +0 -22
  170. data/spec/dummy/db/test.sqlite3 +0 -0
  171. data/spec/support/factory_girl.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d91a2e743748d2a51d918328496e49d81a91825c
4
- data.tar.gz: 76fe50e18ea3255f7294d0b44a812aa4b2ef3220
2
+ SHA256:
3
+ metadata.gz: 0fa829a6f2ebfc46ebf92df73e968beea923bd99adef893b8cdca6219cbd74a4
4
+ data.tar.gz: '03488d3338ffd4c430b7a9995a552bb858d191dd9052a81c16b0d58e39091ec6'
5
5
  SHA512:
6
- metadata.gz: e3513975bc62654becda44650a50a226268c50fb45939878126904f88f7539c144def3b1a03f4344a9ab08bccd0fb1311fa9f3e7b209caf11d1c688043a1ee38
7
- data.tar.gz: 5fdc4378e529e8be73324c7affe3bc36a2e73b2de3d8c7a01bc314ccd11ecfe2bf47717c5364d56fa03ca35e6d574adf7df1d9944362585b35b4a8d9bf6bcbbb
6
+ metadata.gz: 336200e5b9a24ee1ab4978e7107cb02e155576e0e95584e2fbc5f5f70bd8a8ff4723934c9e238632828ac16bd47fdf754c5668b80d767581a2068426519af862
7
+ data.tar.gz: 35c5f6c7b3677507f4942bcb57ce3f6ffb9747a8631772e177d9dbed9c4413569c93279e8759da030290ddf7ebb7bcc1bd45e28a80a1c42949cc57b5bd58706d
data/.gitattributes ADDED
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -0,0 +1,86 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ pull_request:
5
+
6
+ jobs:
7
+ lint:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v4
11
+ - uses: ruby/setup-ruby@v1
12
+ with:
13
+ ruby-version: '3.4'
14
+ bundler-cache: true
15
+ - run: bundle exec rubocop
16
+
17
+ test:
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ ruby: ['3.4', '4.0']
23
+ env:
24
+ RAILS_ENV: test
25
+ TZ: America/Denver
26
+ permissions:
27
+ contents: write
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ - uses: ruby/setup-ruby@v1
31
+ with:
32
+ ruby-version: ${{ matrix.ruby }}
33
+ bundler-cache: true
34
+ - name: Install ImageMagick
35
+ run: sudo apt-get update && sudo apt-get install -y imagemagick
36
+ - name: Set up test database
37
+ run: bundle exec rails db:create db:schema:load
38
+ working-directory: spec/dummy
39
+ # Cuprite drives a real Puma server over HTTP, so it needs the
40
+ # compiled CSS on disk - Propshaft doesn't compile Sass on the
41
+ # fly, and dartsass-rails only does so via this explicit task.
42
+ - name: Build CSS assets
43
+ run: bundle exec rails dartsass:build
44
+ working-directory: spec/dummy
45
+ # Run non-JS and JS (Cuprite) specs as separate rspec processes.
46
+ # Cuprite drives the app on a real server thread with its own DB
47
+ # connection, so writes it makes through the browser commit
48
+ # immediately and can't be rolled back the way DatabaseCleaner's
49
+ # transaction strategy rolls back everything else - running both
50
+ # kinds of spec in one process lets that leak across into unrelated
51
+ # model/helper/controller examples.
52
+ - run: bundle exec rspec --exclude-pattern "spec/features/**/*_spec.rb"
53
+ - run: bundle exec rspec spec/features
54
+ - uses: actions/upload-artifact@v4
55
+ if: always()
56
+ with:
57
+ name: coverage-ruby-${{ matrix.ruby }}
58
+ path: coverage/
59
+ # Publishes a self-hosted coverage badge (badges/coverage.json, read by
60
+ # a shields.io endpoint badge in the README) instead of depending on a
61
+ # third-party coverage service like Coveralls/Codecov. Computed inline
62
+ # (not via a separate job downloading the artifact above) since
63
+ # actions/upload-artifact silently drops SimpleCov's dotfile output
64
+ # (.last_run.json) - staying in the same job/workspace where the
65
+ # coverage/ directory rspec just wrote is guaranteed to still exist
66
+ # sidesteps that entirely. Gated to one matrix leg so only one commit
67
+ # happens per run.
68
+ #
69
+ # `covered_percent` vs `line`: this repo runs rspec twice (non-feature
70
+ # + feature specs as separate processes, see above) and SimpleCov
71
+ # merges the two runs' coverage - the merged .last_run.json uses a
72
+ # different key (`line`) than a single-run result (`covered_percent`,
73
+ # what gem_template's single `bundle exec rspec` produces). Handle
74
+ # both rather than assume one.
75
+ - name: Update coverage badge
76
+ if: matrix.ruby == '4.0' && github.ref_name == github.event.repository.default_branch && github.event_name == 'push'
77
+ run: |
78
+ pct=$(ruby -rjson -e "r = JSON.parse(File.read('coverage/.last_run.json'))['result']; puts (r['covered_percent'] || r['line']).round(1)")
79
+ color=$(ruby -e "pct = $pct; puts(pct >= 90 ? 'brightgreen' : pct >= 75 ? 'yellow' : 'red')")
80
+ mkdir -p badges
81
+ printf '{"schemaVersion":1,"label":"coverage","message":"%s%%","color":"%s"}\n' "$pct" "$color" > badges/coverage.json
82
+ git config user.name "github-actions[bot]"
83
+ git config user.email "github-actions[bot]@users.noreply.github.com"
84
+ git add badges/coverage.json
85
+ git diff --staged --quiet || git commit -m "Update coverage badge [skip ci]"
86
+ git push
data/.gitignore ADDED
@@ -0,0 +1,64 @@
1
+ # rcov generated
2
+ coverage
3
+ coverage.data
4
+
5
+ # rdoc generated
6
+ rdoc
7
+
8
+ # yard generated
9
+ doc
10
+ .yardoc
11
+
12
+ # bundler
13
+ .bundle
14
+
15
+ # jeweler generated
16
+ pkg
17
+
18
+ Gemfile.lock
19
+ spec/dummy/log/
20
+ spec/dummy/tmp/
21
+ spec/dummy/public/system/
22
+ spec/dummy/db/development.sqlite3
23
+ spec/dummy/db/test.sqlite3
24
+ *.sqlite3-journal
25
+ *.sqlite3-shm
26
+ *.sqlite3-wal
27
+ spec/dummy/storage/
28
+ spec/dummy/app/assets/builds/
29
+ spec/dummy/.claude_launch_env.sh
30
+ .claude/
31
+ .idea/
32
+
33
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
34
+ #
35
+ # * Create a file at ~/.gitignore
36
+ # * Include files you want ignored
37
+ # * Run: git config --global core.excludesfile ~/.gitignore
38
+ #
39
+ # After doing this, these files will be ignored in all your git projects,
40
+ # saving you from having to 'pollute' every project you touch with them
41
+ #
42
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
43
+ #
44
+ # For MacOS:
45
+ #
46
+ #.DS_Store
47
+
48
+ # For TextMate
49
+ #*.tmproj
50
+ #tmtags
51
+
52
+ # For emacs:
53
+ #*~
54
+ #\#*
55
+ #.\#*
56
+
57
+ # For vim:
58
+ #*.swp
59
+
60
+ # For redcar:
61
+ #.redcar
62
+
63
+ # For rubinius:
64
+ #*.rbc
data/.rubocop.yml CHANGED
@@ -1,12 +1,21 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
 
3
+ plugins:
4
+ - rubocop-rails
5
+ - rubocop-rake
6
+ - rubocop-rspec
7
+
3
8
  AllCops:
9
+ TargetRubyVersion: 3.2
4
10
  DisplayCopNames: true
11
+ NewCops: enable
12
+ SuggestExtensions: false
5
13
  Exclude:
6
14
  - message_train.gemspec
7
15
  - db/migrate/*
8
16
  - spec/dummy/db/schema.rb
9
17
  - spec/dummy/db/migrate/*
18
+ - vendor/**/*
10
19
 
11
20
  Metrics/BlockLength:
12
21
  Exclude: