demo_mode 2.1.0 → 3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03b87ab2f9b6bcbf88c60b337d047317ed4c7f3021e11c7b54ed57fd4f457f8f
4
- data.tar.gz: 6f7ec3791d4aa078dfe940d0ab213e5909f24d40ba22d4b72a25b8beb82e1af1
3
+ metadata.gz: 68c310d6d0797c6f17fb85f41ec11f72305619323bf7bf2174d6b6a44c2954f4
4
+ data.tar.gz: fd5fe9b737d929072e50576ffedfe93d5e516414adb384a4e6d2b4cdc856868a
5
5
  SHA512:
6
- metadata.gz: 8a58563989f275a048d27f0d020b8bd8f3f43bed7e241a56305d8536baeffe7ab8fc3c9136d554e02f159c699368ef76eec8d124a8977ccc0ede6b5becffe82f
7
- data.tar.gz: be67738d14ce5678b626a16c790b83d0f4532df61f01a1b848a055f26cee8d3e39b09067bbd4da1f3291def7508f57fa430a8220a4aa69b29dfa310aab99b8df
6
+ metadata.gz: a235b3dd997af98b44b1947fc3a8832f33793ef0600a027a935cf8cfc0d6c40f9232b2fe969dc146845e319ae9c150001d33308568e6876b9667a4968f8279d1
7
+ data.tar.gz: f848277ff5fa0a11e27e2c6f0d701069a17b818eceba5e0d86a7e9ce12c5592dfa0b7fe86da1248f07f07122824ccb84a2e3090cb6d0909fbb702f65824a0acf
data/Rakefile CHANGED
@@ -8,6 +8,9 @@ end
8
8
 
9
9
  Bundler::GemHelper.install_tasks
10
10
 
11
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
12
+ load 'rails/tasks/engine.rake'
13
+
11
14
  require 'rubocop/rake_task'
12
15
  RuboCop::RakeTask.new
13
16
 
@@ -15,6 +18,9 @@ require 'rspec/core'
15
18
  require 'rspec/core/rake_task'
16
19
  RSpec::Core::RakeTask.new(:spec)
17
20
 
21
+ desc 'Create a persona'
22
+ task create_user: 'app:persona:create'
23
+
18
24
  def default_task
19
25
  if ENV.fetch('APPRAISAL_INITIALIZED', nil) || ENV.fetch('CI', nil)
20
26
  %i(rubocop spec)
@@ -28,7 +28,7 @@ module DemoMode
28
28
  @session.save_and_generate_account_later!(**options_params.to_unsafe_h.deep_symbolize_keys)
29
29
  session[:demo_session] = { 'id' => @session.id, 'last_request_at' => Time.zone.now }
30
30
  respond_to do |f|
31
- f.html { redirect_to @session }
31
+ f.html { redirect_to @session, status: :see_other }
32
32
  f.json { render_signinable_json }
33
33
  end
34
34
  end
@@ -50,11 +50,12 @@ module DemoMode
50
50
 
51
51
  def render_signinable_json
52
52
  if @session.signinable.blank?
53
- render json: { id: @session.id, processing: true }
53
+ render json: { id: @session.id, processing: @session.processing?, status: @session.status }
54
54
  else
55
55
  render json: {
56
56
  id: @session.id,
57
- processing: false,
57
+ processing: @session.processing?,
58
+ status: @session.status,
58
59
  username: @session.signinable_username,
59
60
  password: @session.signinable_password,
60
61
  }
@@ -8,9 +8,11 @@ module DemoMode
8
8
  raise "Unknown persona: #{session.persona_name}" if persona.blank?
9
9
 
10
10
  signinable = persona.generate!(variant: session.variant, password: session.signinable_password, options: options)
11
- session.update!(signinable: signinable)
11
+ session.update!(signinable: signinable, status: 'successful')
12
12
  end
13
- raise "Failed to create signinable persona!" if session.signinable.blank?
13
+ rescue StandardError => e
14
+ session.update!(status: 'failed')
15
+ raise e
14
16
  end
15
17
  end
16
18
  end
@@ -4,17 +4,26 @@ module DemoMode
4
4
  class Session < ActiveRecord::Base
5
5
  attribute :variant, default: :default
6
6
 
7
+ if ActiveRecord.gem_version >= Gem::Version.new('7.2')
8
+ enum :status, { processing: 'processing', successful: 'successful', failed: 'failed' }, default: 'processing'
9
+ else
10
+ attribute :status, default: :processing
11
+ enum status: { processing: 'processing', successful: 'successful', failed: 'failed' }
12
+ end
13
+
7
14
  validates :persona_name, :variant, presence: true
8
15
  validates :persona, presence: { message: :required }, on: :create, if: :persona_name?
16
+ validate :successful_status_requires_signinable
17
+
9
18
  belongs_to :signinable, polymorphic: true, optional: true
10
19
 
11
20
  before_create :set_password!
12
21
 
13
22
  delegate :begin_demo,
14
- :custom_sign_in?,
15
- :display_credentials?,
16
- to: :persona,
17
- allow_nil: true
23
+ :custom_sign_in?,
24
+ :display_credentials?,
25
+ to: :persona,
26
+ allow_nil: true
18
27
 
19
28
  def signinable_username
20
29
  signinable.public_send(DemoMode.signinable_username_method)
@@ -44,5 +53,11 @@ module DemoMode
44
53
  def set_password!
45
54
  self.signinable_password ||= DemoMode.current_password
46
55
  end
56
+
57
+ def successful_status_requires_signinable
58
+ if status == 'successful' && signinable.blank?
59
+ errors.add(:status, 'cannot be successful if signinable is not present')
60
+ end
61
+ end
47
62
  end
48
63
  end
@@ -17,10 +17,14 @@
17
17
  </article>
18
18
  <% else %>
19
19
  <article class="middle center" data-polling-refresh-url='<%= session_path(@session, format: :json) %>'>
20
- <figure>
20
+ <figure id="LoadingMessage" class="<%= 'hidden' if @session.failed? %>">
21
21
  <%= instance_eval(&DemoMode.loader) %>
22
22
  <h4><span id="DemoTypedText"></span></h4>
23
23
  </figure>
24
+ <div id="ErrorMessage" class="<%= 'hidden' unless @session.failed? %>">
25
+ <div>Unable to generate persona.</div>
26
+ <%= link_to "Go back to persona selection", new_session_path, aria: { label: 'Homepage' } %>
27
+ </div>
24
28
 
25
29
  <script type="text/javascript">
26
30
  new Typed('#DemoTypedText', {
@@ -7,11 +7,15 @@
7
7
  <%= favicon_link_tag '/favicon.ico' %>
8
8
 
9
9
  <% DemoMode.stylesheets.each do |stylesheet| %>
10
- <%= stylesheet_link_tag(stylesheet, media: 'all') %>
10
+ <% if stylesheet.respond_to?(:call) %>
11
+ <%= stylesheet_link_tag(instance_exec(&stylesheet), media: 'all') %>
12
+ <% else %>
13
+ <%= stylesheet_link_tag(stylesheet, media: 'all') %>
14
+ <% end %>
11
15
  <% end %>
12
16
 
13
- <script src="/assets/demo_mode/vendor/typed-v2.1.0.js"></script>
14
- <script src="/assets/demo_mode/demo_mode.js?v=<%= DemoMode::VERSION %>"></script>
17
+ <script src="/demo_mode/assets/vendor/typed-v2.1.0.js"></script>
18
+ <script src="/demo_mode/assets/demo_mode.js?v=<%= DemoMode::VERSION %>"></script>
15
19
  <%= csrf_meta_tags %>
16
20
  <meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0, user-scalable=0">
17
21
  </head>
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddDemoModeSessionsStatus < ActiveRecord::Migration[5.1]
4
+ def change
5
+ add_column :demo_mode_sessions, :status, :string, null: false, default: 'processing'
6
+
7
+ reversible do |dir|
8
+ dir.up do
9
+ execute "UPDATE demo_mode_sessions SET status = 'successful'"
10
+ end
11
+ end
12
+ end
13
+ end
data/lib/demo_mode/cli.rb CHANGED
@@ -27,58 +27,65 @@ class DemoMode::Cli
27
27
  private
28
28
 
29
29
  def ask_next_step
30
- CLI::UI::Prompt.ask('What next?') do |handler|
31
- handler.option("I'm done") do
32
- puts "good bye"
33
- end
34
- handler.option('Keep going') do
35
- prompt_persona
36
- end
30
+ case CLI::UI::Prompt.ask("What next?", options: ["I'm done", "Keep going"])
31
+ in "I'm done"
32
+ puts "good bye"
33
+ in "Keep going"
34
+ prompt_persona
37
35
  end
38
36
  end
39
37
 
40
- def prompt_persona # rubocop:disable Metrics/AbcSize
38
+ def prompt_persona
41
39
  CLI::UI::Frame.open("{{*}} Generate an Account! {{*}}") do
42
- CLI::UI::Prompt.ask('Which persona should we use?') do |handler|
43
- DemoMode.personas.sort_by { |p| p.name.to_s }.each do |persona|
44
- persona_label = persona.name.to_s.titleize
45
-
46
- handler.option(persona_label) do
47
- persona.features.each do |feature|
48
- puts "👉 #{feature}"
49
- end
50
-
51
- named_tags = SemanticLogger.named_tags if defined?(SemanticLogger)
52
-
53
- variant = variant_for(persona, persona_label)
40
+ personas = DemoMode.personas.sort_by { |p| p.name.to_s }
54
41
 
55
- CLI::UI::Spinner.spin("generating account...") do |spinner|
56
- SemanticLogger.push_named_tags(named_tags) if defined?(SemanticLogger)
57
-
58
- session = DemoMode::Session.new(persona_name: persona.name, variant: variant)
59
- session.save_and_generate_account!
60
- spinner.update_title('done!')
61
- created_sessions << session
62
- end
63
- end
42
+ persona_id = CLI::UI::Prompt.ask('Which persona should we use?') do |handler|
43
+ personas.each.with_index do |persona, i|
44
+ handler.option(persona_label(persona)) { i.to_s }
64
45
  end
65
46
  end
47
+
48
+ execute_persona(personas[persona_id.to_i])
66
49
  end
50
+
67
51
  display_personas
68
52
  ask_next_step
69
53
  end
70
54
 
71
- def variant_for(persona, persona_label)
55
+ def execute_persona(persona)
56
+ persona.features.each do |feature|
57
+ puts "👉 #{feature}"
58
+ end
59
+
60
+ named_tags = SemanticLogger.named_tags if defined?(SemanticLogger)
61
+
62
+ variant = variant_for(persona)
63
+
64
+ CLI::UI::Spinner.spin("generating account...") do |spinner|
65
+ SemanticLogger.push_named_tags(named_tags) if defined?(SemanticLogger)
66
+
67
+ session = DemoMode::Session.new(persona_name: persona.name, variant: variant)
68
+ session.save_and_generate_account!
69
+ spinner.update_title('done!')
70
+ created_sessions << session
71
+ end
72
+ end
73
+
74
+ def variant_for(persona)
72
75
  if persona.variants.keys == ['default']
73
76
  :default
74
77
  else
75
78
  CLI::UI::Prompt.ask(
76
- "Which variant should we use for #{persona_label}?",
77
- options: persona.variants.keys,
78
- )
79
+ "Which variant should we use for #{persona_label(persona)}?",
80
+ options: persona.variants.keys.map(&:to_s),
81
+ ).to_sym
79
82
  end
80
83
  end
81
84
 
85
+ def persona_label(persona)
86
+ persona.name.to_s.titleize
87
+ end
88
+
82
89
  def display_personas
83
90
  created_sessions.each do |session|
84
91
  CLI::UI::Frame.open("{{*}} #{session.persona_name} {{*}}") do
@@ -19,7 +19,7 @@ module DemoMode::Clis
19
19
  CLI::UI::Prompt.const_get(:InteractiveOptions)
20
20
  end
21
21
 
22
- def presented_options(recalculate: false) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
22
+ def presented_options(recalculate: false) # rubocop:disable Metrics/PerceivedComplexity
23
23
  return @presented_options unless recalculate
24
24
 
25
25
  @presented_options = @options.zip(1..Float::INFINITY)
@@ -30,8 +30,8 @@ module DemoMode
30
30
 
31
31
  def stylesheets
32
32
  @stylesheets ||= [
33
- "/assets/demo_mode/vendor/normalize-v8.0.1.css",
34
- "/assets/demo_mode/demo_mode.css?v=#{VERSION}",
33
+ "/demo_mode/assets/vendor/normalize-v8.0.1.css",
34
+ "/demo_mode/assets/demo_mode.css?v=#{VERSION}",
35
35
  ]
36
36
  end
37
37
 
@@ -47,7 +47,7 @@ module DemoMode
47
47
  if block
48
48
  @loader = block
49
49
  else
50
- @loader ||= ->(_) { image_tag("/assets/demo_mode/loader.png?v=#{VERSION}") }
50
+ @loader ||= ->(_) { image_tag("/demo_mode/assets/loader.png?v=#{VERSION}") }
51
51
  end
52
52
  end
53
53
 
@@ -64,8 +64,8 @@ module DemoMode
64
64
  end
65
65
 
66
66
  WORDS = %w(area book business case child company country day eye fact family government group home job life lot money month night number
67
- office people phone place point problem program question right room school state story student study system thing time water
68
- way week word work world year).freeze
67
+ office people phone place point problem program question right room school state story student study system thing time water
68
+ way week word work world year).freeze
69
69
 
70
70
  def password(&block)
71
71
  if block
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DemoMode
4
- VERSION = '2.1.0'
4
+ VERSION = '3.0.0'
5
5
  end
data/lib/demo_mode.rb CHANGED
@@ -9,16 +9,16 @@ require 'demo_mode/persona'
9
9
 
10
10
  module DemoMode
11
11
  ICONS = {
12
- tophat: "/assets/demo_mode/icon--tophat.png?v=#{VERSION}",
13
- user: "/assets/demo_mode/icon--user.png?v=#{VERSION}",
14
- users: "/assets/demo_mode/icon--users.png?v=#{VERSION}",
12
+ tophat: "/demo_mode/assets/icon--tophat.png?v=#{VERSION}",
13
+ user: "/demo_mode/assets/icon--user.png?v=#{VERSION}",
14
+ users: "/demo_mode/assets/icon--users.png?v=#{VERSION}",
15
15
  }.freeze
16
16
 
17
17
  class << self
18
18
  delegate(*Config.configurations, to: :configuration)
19
19
 
20
20
  def enabled?
21
- ActiveModel::Type::Boolean::FALSE_VALUES.exclude?(ENV.fetch('DEMO_MODE', false)).tap do |enabled|
21
+ ActiveModel::Type::Boolean::FALSE_VALUES.exclude?(ENV.fetch('DEMO_MODE', 'false')).tap do |enabled|
22
22
  webvalve_check! if enabled && defined?(WebValve)
23
23
  end
24
24
  end
@@ -316,3 +316,7 @@ td {
316
316
  .center {
317
317
  text-align: center;
318
318
  }
319
+
320
+ .hidden {
321
+ display: none;
322
+ }
@@ -1,15 +1,24 @@
1
- (function(document, performance, location) {
1
+ (function (document, performance, location) {
2
2
  function* getJSON(url) {
3
- while(true) { yield fetch(url).then(resp => resp.json()); }
3
+ while (true) {
4
+ yield fetch(url).then((resp) => resp.json());
5
+ }
4
6
  }
5
7
 
6
8
  function pollURL(url, minInterval, success, func) {
7
9
  const then = performance.now();
8
- if(!minInterval) { minInterval = 1000 }
9
- if(!func) { func = getJSON(url) }
10
+ if (!minInterval) {
11
+ minInterval = 1000;
12
+ }
13
+ if (!func) {
14
+ func = getJSON(url);
15
+ }
10
16
 
11
17
  func.next().value.then((resp) => {
12
- if(resp.processing) {
18
+ if (resp.status === 'failed') {
19
+ document.querySelector("#LoadingMessage").classList.add("hidden");
20
+ document.querySelector("#ErrorMessage").classList.remove("hidden");
21
+ } else if (resp.status === 'processing') {
13
22
  setTimeout(
14
23
  () => pollURL(url, minInterval, success, func),
15
24
  Math.max(0, minInterval - (performance.now() - then))
@@ -20,50 +29,54 @@
20
29
  });
21
30
  }
22
31
 
23
- document.addEventListener('DOMContentLoaded', (event) => {
24
- [...document.querySelectorAll('[data-polling-refresh-url]')].forEach((elem) => {
25
- pollURL(
26
- elem.getAttribute('data-polling-refresh-url'),
27
- elem.getAttribute('data-polling-refresh-interval') * 1000,
28
- () => location.reload()
29
- );
30
- });
32
+ document.addEventListener("DOMContentLoaded", (event) => {
33
+ [...document.querySelectorAll("[data-polling-refresh-url]")].forEach(
34
+ (elem) => {
35
+ pollURL(
36
+ elem.getAttribute("data-polling-refresh-url"),
37
+ elem.getAttribute("data-polling-refresh-interval") * 1000,
38
+ () => location.reload()
39
+ );
40
+ }
41
+ );
31
42
  });
32
- }(document, performance, location));
43
+ })(document, performance, location);
33
44
 
34
- (function() {
35
- var TableFilter = (function() {
45
+ (function () {
46
+ var TableFilter = (function () {
36
47
  var input;
37
48
  var inputValue;
38
49
 
39
50
  function onInputEvent(e) {
40
51
  input = e.target;
41
- inputValue = input.value.toLowerCase().replace(/[^0-9a-zA-Z ]/g, '');
42
- updateTable()
43
- updateHistory()
52
+ inputValue = input.value.toLowerCase().replace(/[^0-9a-zA-Z ]/g, "");
53
+ updateTable();
54
+ updateHistory();
44
55
  }
45
56
 
46
57
  function updateTable() {
47
58
  var table = document.querySelector(`.${input.dataset.table}`);
48
59
  if (table) {
49
- Array.prototype.forEach.call(table.tBodies, function(tbody) {
60
+ Array.prototype.forEach.call(table.tBodies, function (tbody) {
50
61
  Array.prototype.forEach.call(tbody.rows, filter);
51
62
  });
52
63
  } else {
53
- alert('TableFilter cannot find its table')
64
+ alert("TableFilter cannot find its table");
54
65
  }
55
66
  }
56
67
 
57
68
  function updateHistory() {
58
- var searchParams = new URLSearchParams(window.location.search)
69
+ var searchParams = new URLSearchParams(window.location.search);
59
70
  searchParams.set("search", inputValue);
60
- var newRelativePathQuery = window.location.pathname + '?' + searchParams.toString();
61
- history.pushState(null, '', newRelativePathQuery);
71
+ var newRelativePathQuery =
72
+ window.location.pathname + "?" + searchParams.toString();
73
+ history.pushState(null, "", newRelativePathQuery);
62
74
  }
63
75
 
64
76
  function filter(row) {
65
- var text = row.textContent.toLowerCase().replace(/[^0-9a-zA-Z ]/g,'');
66
- row.style.display = text.indexOf(inputValue) === -1 ? 'none' : 'table-row';
77
+ var text = row.textContent.toLowerCase().replace(/[^0-9a-zA-Z ]/g, "");
78
+ row.style.display =
79
+ text.indexOf(inputValue) === -1 ? "none" : "table-row";
67
80
  }
68
81
 
69
82
  function debounce(func, threshold) {
@@ -76,7 +89,7 @@
76
89
  function delayed() {
77
90
  func.apply(obj, args);
78
91
  timeout = null;
79
- };
92
+ }
80
93
 
81
94
  if (timeout) {
82
95
  clearTimeout(timeout);
@@ -86,32 +99,32 @@
86
99
  }
87
100
 
88
101
  return {
89
- init: function() {
90
- var input = document.querySelector('input[data-behavior=table-filter]');
102
+ init: function () {
103
+ var input = document.querySelector("input[data-behavior=table-filter]");
91
104
  if (!input) return;
92
105
 
93
106
  input.oninput = debounce(onInputEvent, 250);
94
107
  var urlParams = new URLSearchParams(window.location.search);
95
- var search = urlParams.get('search');
108
+ var search = urlParams.get("search");
96
109
  if (search) {
97
- input.value = search
98
- input.dispatchEvent(new InputEvent('input', { data: search }));
110
+ input.value = search;
111
+ input.dispatchEvent(new InputEvent("input", { data: search }));
99
112
  }
100
113
 
101
- window.addEventListener('popstate', (event) => {
114
+ window.addEventListener("popstate", (event) => {
102
115
  var urlParams = new URLSearchParams(window.location.search);
103
- var search = urlParams.get('search');
116
+ var search = urlParams.get("search");
104
117
  if (search) {
105
118
  input.value = search;
106
119
  inputValue = search;
107
- updateTable()
120
+ updateTable();
108
121
  }
109
122
  });
110
- }
123
+ },
111
124
  };
112
125
  })();
113
126
 
114
- document.addEventListener('DOMContentLoaded', (event) => {
127
+ document.addEventListener("DOMContentLoaded", (event) => {
115
128
  TableFilter.init();
116
129
  });
117
130
  })();
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: demo_mode
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Griffith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-10 00:00:00.000000000 Z
11
+ date: 2025-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -94,16 +94,16 @@ dependencies:
94
94
  name: cli-ui
95
95
  requirement: !ruby/object:Gem::Requirement
96
96
  requirements:
97
- - - ">="
97
+ - - "~>"
98
98
  - !ruby/object:Gem::Version
99
- version: '0'
99
+ version: '2.3'
100
100
  type: :runtime
101
101
  prerelease: false
102
102
  version_requirements: !ruby/object:Gem::Requirement
103
103
  requirements:
104
- - - ">="
104
+ - - "~>"
105
105
  - !ruby/object:Gem::Version
106
- version: '0'
106
+ version: '2.3'
107
107
  - !ruby/object:Gem::Dependency
108
108
  name: railties
109
109
  requirement: !ruby/object:Gem::Requirement
@@ -186,20 +186,6 @@ dependencies:
186
186
  - - ">="
187
187
  - !ruby/object:Gem::Version
188
188
  version: '0'
189
- - !ruby/object:Gem::Dependency
190
- name: combustion
191
- requirement: !ruby/object:Gem::Requirement
192
- requirements:
193
- - - ">="
194
- - !ruby/object:Gem::Version
195
- version: '0'
196
- type: :development
197
- prerelease: false
198
- version_requirements: !ruby/object:Gem::Requirement
199
- requirements:
200
- - - ">="
201
- - !ruby/object:Gem::Version
202
- version: '0'
203
189
  - !ruby/object:Gem::Dependency
204
190
  name: cuprite
205
191
  requirement: !ruby/object:Gem::Requirement
@@ -257,7 +243,7 @@ dependencies:
257
243
  - !ruby/object:Gem::Version
258
244
  version: '0'
259
245
  - !ruby/object:Gem::Dependency
260
- name: sprockets-rails
246
+ name: sorbet-runtime
261
247
  requirement: !ruby/object:Gem::Requirement
262
248
  requirements:
263
249
  - - ">="
@@ -271,7 +257,7 @@ dependencies:
271
257
  - !ruby/object:Gem::Version
272
258
  version: '0'
273
259
  - !ruby/object:Gem::Dependency
274
- name: sqlite3
260
+ name: sprockets-rails
275
261
  requirement: !ruby/object:Gem::Requirement
276
262
  requirements:
277
263
  - - ">="
@@ -285,7 +271,7 @@ dependencies:
285
271
  - !ruby/object:Gem::Version
286
272
  version: '0'
287
273
  - !ruby/object:Gem::Dependency
288
- name: uncruft
274
+ name: sqlite3
289
275
  requirement: !ruby/object:Gem::Requirement
290
276
  requirements:
291
277
  - - ">="
@@ -336,6 +322,7 @@ files:
336
322
  - db/migrate/20190503143021_add_demo_mode_sessions.rb
337
323
  - db/migrate/20201111000000_add_demo_mode_sessions_variant.rb
338
324
  - db/migrate/20210505000000_add_demo_mode_sessions_password.rb
325
+ - db/migrate/20250210222933_add_demo_mode_sessions_status.rb
339
326
  - lib/demo_mode.rb
340
327
  - lib/demo_mode/clever_sequence.rb
341
328
  - lib/demo_mode/cli.rb
@@ -350,14 +337,14 @@ files:
350
337
  - lib/generators/demo_mode/install_generator.rb
351
338
  - lib/generators/templates/initializer.rb
352
339
  - lib/generators/templates/sample_persona.rb
353
- - public/assets/demo_mode/demo_mode.css
354
- - public/assets/demo_mode/demo_mode.js
355
- - public/assets/demo_mode/icon--tophat.png
356
- - public/assets/demo_mode/icon--user.png
357
- - public/assets/demo_mode/icon--users.png
358
- - public/assets/demo_mode/loader.png
359
- - public/assets/demo_mode/vendor/normalize-v8.0.1.css
360
- - public/assets/demo_mode/vendor/typed-v2.1.0.js
340
+ - public/demo_mode/assets/demo_mode.css
341
+ - public/demo_mode/assets/demo_mode.js
342
+ - public/demo_mode/assets/icon--tophat.png
343
+ - public/demo_mode/assets/icon--user.png
344
+ - public/demo_mode/assets/icon--users.png
345
+ - public/demo_mode/assets/loader.png
346
+ - public/demo_mode/assets/vendor/normalize-v8.0.1.css
347
+ - public/demo_mode/assets/vendor/typed-v2.1.0.js
361
348
  homepage: http://github.com/betterment/demo_mode
362
349
  licenses:
363
350
  - MIT