bible270 0.6.2

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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +181 -0
  3. data/MIT-LICENSE +18 -0
  4. data/README.md +373 -0
  5. data/Rakefile +11 -0
  6. data/app/controllers/bible270/application_controller.rb +48 -0
  7. data/app/controllers/bible270/checkoffs_controller.rb +32 -0
  8. data/app/controllers/bible270/comments_controller.rb +46 -0
  9. data/app/controllers/bible270/days_controller.rb +42 -0
  10. data/app/controllers/bible270/readers_controller.rb +46 -0
  11. data/app/controllers/bible270/sessions_controller.rb +126 -0
  12. data/app/helpers/bible270/plan_helper.rb +45 -0
  13. data/app/mailers/bible270/application_mailer.rb +7 -0
  14. data/app/mailers/bible270/sign_in_mailer.rb +14 -0
  15. data/app/models/bible270/application_record.rb +6 -0
  16. data/app/models/bible270/checkoff.rb +23 -0
  17. data/app/models/bible270/comment.rb +16 -0
  18. data/app/models/bible270/reader.rb +211 -0
  19. data/app/models/bible270/sign_in_token.rb +74 -0
  20. data/app/views/bible270/checkoffs/toggle.turbo_stream.erb +4 -0
  21. data/app/views/bible270/comments/_comment.html.erb +15 -0
  22. data/app/views/bible270/comments/_form.html.erb +13 -0
  23. data/app/views/bible270/comments/create.turbo_stream.erb +7 -0
  24. data/app/views/bible270/comments/destroy.turbo_stream.erb +1 -0
  25. data/app/views/bible270/days/_reading.html.erb +25 -0
  26. data/app/views/bible270/days/_start_date.html.erb +43 -0
  27. data/app/views/bible270/days/index.html.erb +72 -0
  28. data/app/views/bible270/days/show.html.erb +50 -0
  29. data/app/views/bible270/readers/index.html.erb +24 -0
  30. data/app/views/bible270/readers/show.html.erb +41 -0
  31. data/app/views/bible270/sessions/new.html.erb +52 -0
  32. data/app/views/bible270/shared/_header.html.erb +20 -0
  33. data/app/views/bible270/shared/_styles.html.erb +147 -0
  34. data/app/views/bible270/sign_in_mailer/magic_link.html.erb +20 -0
  35. data/app/views/bible270/sign_in_mailer/magic_link.text.erb +7 -0
  36. data/app/views/layouts/bible270/application.html.erb +28 -0
  37. data/config/routes.rb +30 -0
  38. data/db/migrate/20260101000001_create_bible270_readers.rb +17 -0
  39. data/db/migrate/20260101000002_create_bible270_checkoffs.rb +15 -0
  40. data/db/migrate/20260101000003_create_bible270_comments.rb +14 -0
  41. data/db/migrate/20260101000004_create_bible270_sign_in_tokens.rb +18 -0
  42. data/lib/bible270/configuration.rb +177 -0
  43. data/lib/bible270/email_sign_in.rb +68 -0
  44. data/lib/bible270/engine.rb +21 -0
  45. data/lib/bible270/plan.rb +352 -0
  46. data/lib/bible270/versification.rb +83 -0
  47. data/lib/bible270/version.rb +4 -0
  48. data/lib/bible270.rb +9 -0
  49. data/lib/generators/bible270/install/install_generator.rb +66 -0
  50. data/lib/generators/bible270/install/templates/bible270.rb.tt +41 -0
  51. data/lib/generators/bible270/install/templates/omniauth.rb.tt +25 -0
  52. metadata +158 -0
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+ # Verse counts per chapter (standard English / KJV versification).
3
+ # Verse counts are facts about the text's structure, used purely to weight
4
+ # daily reading portions by length. Generated from a public-domain KJV text.
5
+ module Bible270
6
+ module Versification
7
+ # book name => [verses in chapter 1, chapter 2, ...]
8
+ VERSES = {
9
+ "Genesis" => [31, 25, 24, 26, 32, 22, 24, 22, 29, 32, 32, 20, 18, 24, 21, 16, 27, 33, 38, 18, 34, 24, 20, 67, 34, 35, 46, 22, 35, 43, 55, 32, 20, 31, 29, 43, 36, 30, 23, 23, 57, 38, 34, 34, 28, 34, 31, 22, 33, 26],
10
+ "Exodus" => [22, 25, 22, 31, 23, 30, 25, 32, 35, 29, 10, 51, 22, 31, 27, 36, 16, 27, 25, 26, 36, 31, 33, 18, 40, 37, 21, 43, 46, 38, 18, 35, 23, 35, 35, 38, 29, 31, 43, 38],
11
+ "Leviticus" => [17, 16, 17, 35, 19, 30, 38, 36, 24, 20, 47, 8, 59, 57, 33, 34, 16, 30, 37, 27, 24, 33, 44, 23, 55, 46, 34],
12
+ "Numbers" => [54, 34, 51, 49, 31, 27, 89, 26, 23, 36, 35, 16, 33, 45, 41, 50, 13, 32, 22, 29, 35, 41, 30, 25, 18, 65, 23, 31, 40, 16, 54, 42, 56, 29, 34, 13],
13
+ "Deuteronomy" => [46, 37, 29, 49, 33, 25, 26, 20, 29, 22, 32, 32, 18, 29, 23, 22, 20, 22, 21, 20, 23, 30, 25, 22, 19, 19, 26, 68, 29, 20, 30, 52, 29, 12],
14
+ "Joshua" => [18, 24, 17, 24, 15, 27, 26, 35, 27, 43, 23, 24, 33, 15, 63, 10, 18, 28, 51, 9, 45, 34, 16, 33],
15
+ "Judges" => [36, 23, 31, 24, 31, 40, 25, 35, 57, 18, 40, 15, 25, 20, 20, 31, 13, 31, 30, 48, 25],
16
+ "Ruth" => [22, 23, 18, 22],
17
+ "1 Samuel" => [28, 36, 21, 22, 12, 21, 17, 22, 27, 27, 15, 25, 23, 52, 35, 23, 58, 30, 24, 43, 15, 23, 29, 22, 44, 25, 12, 25, 11, 31, 13],
18
+ "2 Samuel" => [27, 32, 39, 12, 25, 23, 29, 18, 13, 19, 27, 31, 39, 33, 37, 23, 29, 33, 43, 26, 22, 51, 39, 25],
19
+ "1 Kings" => [53, 46, 28, 34, 18, 38, 51, 66, 28, 29, 43, 33, 34, 31, 34, 34, 24, 46, 21, 43, 29, 54],
20
+ "2 Kings" => [18, 25, 27, 44, 27, 33, 20, 29, 37, 36, 21, 21, 25, 29, 38, 20, 41, 37, 37, 21, 26, 20, 37, 20, 30],
21
+ "1 Chronicles" => [54, 55, 24, 43, 26, 81, 40, 40, 44, 14, 47, 40, 14, 17, 29, 43, 27, 17, 19, 8, 30, 19, 32, 31, 31, 32, 34, 21, 30],
22
+ "2 Chronicles" => [17, 18, 17, 22, 14, 42, 22, 18, 31, 19, 23, 16, 22, 15, 19, 14, 19, 34, 11, 37, 20, 12, 21, 27, 28, 23, 9, 27, 36, 27, 21, 33, 25, 33, 27, 23],
23
+ "Ezra" => [11, 70, 13, 24, 17, 22, 28, 36, 15, 44],
24
+ "Nehemiah" => [11, 20, 32, 23, 19, 19, 73, 18, 38, 39, 36, 47, 31],
25
+ "Esther" => [22, 23, 15, 17, 14, 14, 10, 17, 32, 3],
26
+ "Job" => [22, 13, 26, 21, 27, 30, 21, 22, 35, 22, 20, 25, 28, 22, 35, 22, 16, 21, 29, 29, 34, 30, 17, 25, 6, 14, 23, 28, 25, 31, 40, 22, 33, 37, 16, 33, 24, 41, 30, 24, 34, 17],
27
+ "Psalm" => [6, 12, 8, 8, 12, 10, 17, 9, 20, 18, 7, 8, 6, 7, 5, 11, 15, 50, 14, 9, 13, 31, 6, 10, 22, 12, 14, 9, 11, 12, 24, 11, 22, 22, 28, 12, 40, 22, 13, 17, 13, 11, 5, 26, 17, 11, 9, 14, 20, 23, 19, 9, 6, 7, 23, 13, 11, 11, 17, 12, 8, 12, 11, 10, 13, 20, 7, 35, 36, 5, 24, 20, 28, 23, 10, 12, 20, 72, 13, 19, 16, 8, 18, 12, 13, 17, 7, 18, 52, 17, 16, 15, 5, 23, 11, 13, 12, 9, 9, 5, 8, 28, 22, 35, 45, 48, 43, 13, 31, 7, 10, 10, 9, 8, 18, 19, 2, 29, 176, 7, 8, 9, 4, 8, 5, 6, 5, 6, 8, 8, 3, 18, 3, 3, 21, 26, 9, 8, 24, 13, 10, 7, 12, 15, 21, 10, 20, 14, 9, 6],
28
+ "Proverbs" => [33, 22, 35, 27, 23, 35, 27, 36, 18, 32, 31, 28, 25, 35, 33, 33, 28, 24, 29, 30, 31, 29, 35, 34, 28, 28, 27, 28, 27, 33, 31],
29
+ "Ecclesiastes" => [18, 26, 22, 16, 20, 12, 29, 17, 18, 20, 10, 14],
30
+ "Song of Solomon" => [17, 17, 11, 16, 16, 13, 13, 14],
31
+ "Isaiah" => [31, 22, 26, 6, 30, 13, 25, 22, 21, 34, 16, 6, 22, 32, 9, 14, 14, 7, 25, 6, 17, 25, 18, 23, 12, 21, 13, 29, 24, 33, 9, 20, 24, 17, 10, 22, 38, 22, 8, 31, 29, 25, 28, 28, 25, 13, 15, 22, 26, 11, 23, 15, 12, 17, 13, 12, 21, 14, 21, 22, 11, 12, 19, 12, 25, 24],
32
+ "Jeremiah" => [19, 37, 25, 31, 31, 30, 34, 22, 26, 25, 23, 17, 27, 22, 21, 21, 27, 23, 15, 18, 14, 30, 40, 10, 38, 24, 22, 17, 32, 24, 40, 44, 26, 22, 19, 32, 21, 28, 18, 16, 18, 22, 13, 30, 5, 28, 7, 47, 39, 46, 64, 34],
33
+ "Lamentations" => [22, 22, 66, 22, 22],
34
+ "Ezekiel" => [28, 10, 27, 17, 17, 14, 27, 18, 11, 22, 25, 28, 23, 23, 8, 63, 24, 32, 14, 49, 32, 31, 49, 27, 17, 21, 36, 26, 21, 26, 18, 32, 33, 31, 15, 38, 28, 23, 29, 49, 26, 20, 27, 31, 25, 24, 23, 35],
35
+ "Daniel" => [21, 49, 30, 37, 31, 28, 28, 27, 27, 21, 45, 13],
36
+ "Hosea" => [11, 23, 5, 19, 15, 11, 16, 14, 17, 15, 12, 14, 16, 9],
37
+ "Joel" => [20, 32, 21],
38
+ "Amos" => [15, 16, 15, 13, 27, 14, 17, 14, 15],
39
+ "Obadiah" => [21],
40
+ "Jonah" => [17, 10, 10, 11],
41
+ "Micah" => [16, 13, 12, 13, 15, 16, 20],
42
+ "Nahum" => [15, 13, 19],
43
+ "Habakkuk" => [17, 20, 19],
44
+ "Zephaniah" => [18, 15, 20],
45
+ "Haggai" => [15, 23],
46
+ "Zechariah" => [21, 13, 10, 14, 11, 15, 14, 23, 17, 12, 17, 14, 9, 21],
47
+ "Malachi" => [14, 17, 18, 6],
48
+ "Matthew" => [25, 22, 17, 25, 48, 34, 29, 34, 38, 42, 30, 50, 58, 36, 39, 28, 27, 35, 30, 34, 46, 45, 39, 51, 46, 74, 66, 20],
49
+ "Mark" => [45, 28, 35, 40, 43, 56, 36, 37, 50, 52, 33, 44, 37, 72, 47, 20],
50
+ "Luke" => [80, 52, 38, 44, 39, 49, 50, 56, 62, 42, 54, 59, 35, 35, 32, 31, 37, 43, 48, 47, 38, 71, 56, 53],
51
+ "John" => [51, 25, 36, 54, 47, 71, 53, 59, 41, 42, 57, 50, 38, 31, 27, 33, 26, 40, 42, 31, 25],
52
+ "Acts" => [26, 47, 26, 37, 42, 15, 60, 40, 43, 48, 30, 25, 52, 28, 41, 40, 34, 28, 41, 38, 40, 30, 35, 27, 27, 32, 44, 31],
53
+ "Romans" => [32, 29, 31, 25, 21, 23, 25, 39, 33, 21, 36, 21, 14, 23, 33, 27],
54
+ "1 Corinthians" => [31, 16, 23, 21, 13, 20, 40, 13, 27, 33, 34, 31, 13, 40, 58, 24],
55
+ "2 Corinthians" => [24, 17, 18, 18, 21, 18, 16, 24, 15, 18, 33, 21, 14],
56
+ "Galatians" => [24, 21, 29, 31, 26, 18],
57
+ "Ephesians" => [23, 22, 21, 32, 33, 24],
58
+ "Philippians" => [30, 30, 21, 23],
59
+ "Colossians" => [29, 23, 25, 18],
60
+ "1 Thessalonians" => [10, 20, 13, 18, 28],
61
+ "2 Thessalonians" => [12, 17, 18],
62
+ "1 Timothy" => [20, 15, 16, 16, 25, 21],
63
+ "2 Timothy" => [18, 26, 17, 22],
64
+ "Titus" => [16, 15, 15],
65
+ "Philemon" => [25],
66
+ "Hebrews" => [14, 18, 19, 16, 14, 20, 28, 13, 28, 39, 40, 29, 25],
67
+ "James" => [27, 26, 18, 17, 20],
68
+ "1 Peter" => [25, 25, 22, 19, 14],
69
+ "2 Peter" => [21, 22, 18],
70
+ "1 John" => [10, 29, 24, 21, 21],
71
+ "2 John" => [13],
72
+ "3 John" => [15],
73
+ "Jude" => [25],
74
+ "Revelation" => [20, 29, 22, 11, 14, 17, 17, 13, 21, 11, 19, 18, 18, 20, 8, 21, 18, 24, 21, 15, 27, 21],
75
+ }.freeze
76
+
77
+ module_function
78
+
79
+ def verses(book, chapter) = VERSES.fetch(book)[chapter - 1]
80
+ def chapter_count(book) = VERSES.fetch(book).size
81
+ def total_verses(book) = VERSES.fetch(book).sum
82
+ end
83
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ module Bible270
3
+ VERSION = "0.6.2"
4
+ end
data/lib/bible270.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ require "bible270/version"
3
+ require "bible270/plan"
4
+ require "bible270/email_sign_in"
5
+ require "bible270/configuration"
6
+ require "bible270/engine" if defined?(Rails::Engine)
7
+
8
+ module Bible270
9
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+ require "rails/generators"
3
+
4
+ module Bible270
5
+ module Generators
6
+ # rails generate bible270:install [--mount-at=/reading-plan] [--providers=github]
7
+ #
8
+ # Writes the engine initializer and an OmniAuth initializer whose path_prefix
9
+ # matches the mount point (the one detail that is easy to get wrong).
10
+ class InstallGenerator < Rails::Generators::Base
11
+ source_root File.expand_path("templates", __dir__)
12
+
13
+ class_option :mount_at, type: :string, default: "/reading-plan",
14
+ desc: "Path the engine is mounted at"
15
+ class_option :providers, type: :string, default: "github",
16
+ desc: "Comma-separated OmniAuth providers (e.g. github,google_oauth2)"
17
+
18
+ def create_initializers
19
+ template "bible270.rb.tt", "config/initializers/bible270.rb"
20
+ template "omniauth.rb.tt", "config/initializers/omniauth.rb"
21
+ end
22
+
23
+ def add_route
24
+ route %(mount Bible270::Engine, at: "#{mount_at}")
25
+ end
26
+
27
+ def show_next_steps
28
+ say ""
29
+ say "bible270 installed.", :green
30
+ say ""
31
+ say "Next steps:"
32
+ say " 1. Add the strategy gems to your Gemfile, e.g.:"
33
+ provider_list.each { |p| say " gem \"omniauth-#{p.tr('_', '-')}\"" }
34
+ say " plus: gem \"omniauth\" and gem \"omniauth-rails_csrf_protection\""
35
+ say " 2. bundle install"
36
+ say " 3. bin/rails bible270:install:migrations && bin/rails db:migrate"
37
+ say " 4. Set the provider credentials in your environment / credentials store."
38
+ say " 5. Set config.mailer_from and make sure Action Mailer can deliver"
39
+ say " (email sign-in is what lets readers without a social account join)."
40
+ say " 6. Register the callback URL with each provider:"
41
+ provider_list.each { |p| say " https://YOUR-HOST#{mount_at}/auth/#{p}/callback" }
42
+ say ""
43
+ end
44
+
45
+ private
46
+
47
+ def mount_at
48
+ path = options[:mount_at].to_s
49
+ path = "/#{path}" unless path.start_with?("/")
50
+ path.chomp("/")
51
+ end
52
+
53
+ def provider_list
54
+ options[:providers].to_s.split(",").map { |p| p.strip }.reject(&:empty?)
55
+ end
56
+
57
+ def providers_literal
58
+ provider_list.map { |p| ":#{p}" }.join(", ")
59
+ end
60
+
61
+ def omniauth_path_prefix
62
+ "#{mount_at}/auth"
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # bible270 configuration. See the gem README for the full reference.
4
+ Bible270.configure do |config|
5
+ config.app_name = "Daily Bread"
6
+ config.tagline = "A 270-day journey through Scripture"
7
+
8
+ # Share the host application's layout, helpers and CSRF setup.
9
+ config.parent_controller = "::ApplicationController"
10
+ # config.layout = "layouts/application"
11
+
12
+ # --- Authentication --------------------------------------------------------
13
+ # Email sign-in: a one-time link, no password, no third-party account needed.
14
+ # This is what lets anyone take part. Requires Action Mailer delivery to work.
15
+ config.email_sign_in = true
16
+ config.mailer_from = "no-reply@example.com" # <- change me
17
+ # config.email_sign_in_ttl = 20 * 60 # link lifetime, seconds
18
+ # config.email_sign_in_max_per_window = 5 # per email, per window
19
+ # config.email_sign_in_window = 15 * 60
20
+ config.email_sign_in_ask_name = true # let readers choose a display name
21
+ # config.email_sign_in_deliver_later = true # if you have a queue backend
22
+
23
+ # Optional social sign-in. The matching strategy gems and credentials live in
24
+ # the host app (see config/initializers/omniauth.rb). Set to [] to use email only.
25
+ config.omniauth_providers = [<%= providers_literal %>]
26
+
27
+ # Viewing the plan is always public; checking off and commenting require a reader.
28
+ config.require_sign_in_to_participate = true
29
+
30
+ # Where to land after signing in / out (defaults to the plan's own root).
31
+ # config.after_sign_in_path = "<%= mount_at %>"
32
+ # config.after_sign_out_path = "/"
33
+
34
+ # --- Start date ------------------------------------------------------------
35
+ # Community-wide start date (Date, Time, or "YYYY-MM-DD"), or nil for undated.
36
+ # config.start_date = Date.new(2026, 9, 6)
37
+ config.allow_reader_start_date = true
38
+
39
+ # --- Reading links ---------------------------------------------------------
40
+ config.bible_version = "ESV"
41
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # OmniAuth middleware for bible270's built-in sign-in.
4
+ #
5
+ # IMPORTANT: path_prefix must match where the engine is mounted, so that
6
+ # OmniAuth's callback (<prefix>/:provider/callback) lands on the engine's
7
+ # route. bible270 derives its sign-in button paths from the same value.
8
+ #
9
+ # OmniAuth 2.0+ only allows POST to the request phase (CVE-2015-9284);
10
+ # omniauth-rails_csrf_protection supplies the Rails-aware token check, and
11
+ # bible270's sign-in controls are already POST forms.
12
+ Rails.application.config.middleware.use OmniAuth::Builder do
13
+ path_prefix "<%= omniauth_path_prefix %>"
14
+
15
+ <% provider_list.each do |p| -%>
16
+ provider :<%= p %>,
17
+ Rails.application.credentials.dig(:<%= p %>, :client_id) || ENV["<%= p.upcase %>_CLIENT_ID"],
18
+ Rails.application.credentials.dig(:<%= p %>, :client_secret) || ENV["<%= p.upcase %>_CLIENT_SECRET"]
19
+ <% end -%>
20
+ end
21
+
22
+ # Send OmniAuth failures to the engine's failure route rather than raising.
23
+ OmniAuth.config.on_failure = proc do |env|
24
+ Bible270::SessionsController.action(:failure).call(env)
25
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bible270
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.2
5
+ platform: ruby
6
+ authors:
7
+ - Andrew vonderLuft
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '7.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '7.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: omniauth
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: omniauth-rails_csrf_protection
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '1.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '1.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: minitest
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '5.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '5.0'
68
+ description: 'Drop-in Rails engine that adds a social daily Bible reading plan over
69
+ 270 days: the Old Testament once, the New Testament twice, and a whole-chapter Psalms/Proverbs
70
+ companion. Daily portions are balanced by verse count so each day takes about the
71
+ same time to read, and chapters are never split except Psalm 119. Readers check
72
+ off each day''s readings, leave reflections, and see one another''s progress. Designed
73
+ to mount cleanly into a host Rails app such as ComfortableMediaSurfer.'
74
+ email:
75
+ - wonder@hey.com
76
+ executables: []
77
+ extensions: []
78
+ extra_rdoc_files: []
79
+ files:
80
+ - CHANGELOG.md
81
+ - MIT-LICENSE
82
+ - README.md
83
+ - Rakefile
84
+ - app/controllers/bible270/application_controller.rb
85
+ - app/controllers/bible270/checkoffs_controller.rb
86
+ - app/controllers/bible270/comments_controller.rb
87
+ - app/controllers/bible270/days_controller.rb
88
+ - app/controllers/bible270/readers_controller.rb
89
+ - app/controllers/bible270/sessions_controller.rb
90
+ - app/helpers/bible270/plan_helper.rb
91
+ - app/mailers/bible270/application_mailer.rb
92
+ - app/mailers/bible270/sign_in_mailer.rb
93
+ - app/models/bible270/application_record.rb
94
+ - app/models/bible270/checkoff.rb
95
+ - app/models/bible270/comment.rb
96
+ - app/models/bible270/reader.rb
97
+ - app/models/bible270/sign_in_token.rb
98
+ - app/views/bible270/checkoffs/toggle.turbo_stream.erb
99
+ - app/views/bible270/comments/_comment.html.erb
100
+ - app/views/bible270/comments/_form.html.erb
101
+ - app/views/bible270/comments/create.turbo_stream.erb
102
+ - app/views/bible270/comments/destroy.turbo_stream.erb
103
+ - app/views/bible270/days/_reading.html.erb
104
+ - app/views/bible270/days/_start_date.html.erb
105
+ - app/views/bible270/days/index.html.erb
106
+ - app/views/bible270/days/show.html.erb
107
+ - app/views/bible270/readers/index.html.erb
108
+ - app/views/bible270/readers/show.html.erb
109
+ - app/views/bible270/sessions/new.html.erb
110
+ - app/views/bible270/shared/_header.html.erb
111
+ - app/views/bible270/shared/_styles.html.erb
112
+ - app/views/bible270/sign_in_mailer/magic_link.html.erb
113
+ - app/views/bible270/sign_in_mailer/magic_link.text.erb
114
+ - app/views/layouts/bible270/application.html.erb
115
+ - config/routes.rb
116
+ - db/migrate/20260101000001_create_bible270_readers.rb
117
+ - db/migrate/20260101000002_create_bible270_checkoffs.rb
118
+ - db/migrate/20260101000003_create_bible270_comments.rb
119
+ - db/migrate/20260101000004_create_bible270_sign_in_tokens.rb
120
+ - lib/bible270.rb
121
+ - lib/bible270/configuration.rb
122
+ - lib/bible270/email_sign_in.rb
123
+ - lib/bible270/engine.rb
124
+ - lib/bible270/plan.rb
125
+ - lib/bible270/versification.rb
126
+ - lib/bible270/version.rb
127
+ - lib/generators/bible270/install/install_generator.rb
128
+ - lib/generators/bible270/install/templates/bible270.rb.tt
129
+ - lib/generators/bible270/install/templates/omniauth.rb.tt
130
+ homepage: https://gknt.org
131
+ licenses:
132
+ - MIT
133
+ metadata:
134
+ homepage_uri: https://gknt.org
135
+ source_code_uri: https://github.com/avonderluft/bible270
136
+ bug_tracker_uri: https://github.com/avonderluft/bible270/issues
137
+ changelog_uri: https://github.com/avonderluft/bible270/blob/main/CHANGELOG.md
138
+ rubygems_mfa_required: 'true'
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '3.0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubygems_version: 4.0.16
154
+ specification_version: 4
155
+ summary: 'A mountable Rails engine: a 270-day, verse-balanced Bible reading plan (OT
156
+ once, NT twice, Psalms/Proverbs alongside) with per-user check-offs, comments, and
157
+ shared community progress.'
158
+ test_files: []