abraham 2.1.2 → 2.5.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: 934942f3a067c17e06029f1095f7abf5b570d5e7b63a8d16601769df4d3300e1
4
- data.tar.gz: 2389400109634350208fff528edf7c70577982677f34e8af9ef84dcb49aa9d5a
3
+ metadata.gz: 025f51bb1380ebbd7c172d43d66b79ca4b68fdb4eb4af6940364fff44b282176
4
+ data.tar.gz: a791c10896b5f002e1aa5daa8edccd2ec810a4479aeccac4a5d8b28a52795c5d
5
5
  SHA512:
6
- metadata.gz: ec5c02fcd3b19038b65b9a3af6ce3d84f585c47e465a914021d05a18c340665fb1891fb590fb76b332a05eb5d7e6736e89aba9e854cf94ad0acb921c4cc623ce
7
- data.tar.gz: c00a73dfe7269459459fadaa4db889de665ec0601273fa431d94372cf38383e4f0a5c1b5959fbf0a7f5ea681fb149948dadc2ec4670e09941b54356979500274
6
+ metadata.gz: 4e6f5e3fae2acca16748c5ace7c7fde3436e3aab72604c3e35030d5488ec389fd4903ff53a63dbdc4fe473a554853860a6d6f05e8a126bd49d7ae15f71c573b4
7
+ data.tar.gz: 816fb772c290eb0504885b2e93f21d952e7322bf87c05ca3332d57c6ff81fb1e5062a93824d5d087b142c05e4efab6af2f01fdbbc12623b9b3740acb82cc4a7d
data/README.md CHANGED
@@ -6,16 +6,19 @@ _Guide your users in the one true path._
6
6
 
7
7
  ![Watercolor Sheep](https://upload.wikimedia.org/wikipedia/commons/e/e4/Watercolor_Sheep_Drawing.jpg)
8
8
 
9
- Abraham injects dynamically-generated [Shepherd](https://shepherdjs.dev/) JavaScript code into your Rails application whenever a user should see a guided tour. Skip a tour, and we'll try again next time; complete a tour, and it won't show up again.
9
+ Abraham makes it easy to show guided tours to users of your Rails application. When Abraham shows a tour, it keeps track of whether the user has completed it (so it doesn't get shown again) or dismissed it for later (so it reappears in a future user session).
10
10
 
11
11
  * Define tour content with simple YAML files, in any/many languages.
12
12
  * Organize tours by controller and action.
13
- * Plays nicely with Turbolinks.
14
- * Ships with two basic CSS themes (default & dark) -- or write your own
13
+ * Trigger tours automatically on page load or manually via JavaScript method.
14
+ * Built with the [Shepherd JS](https://shepherdjs.dev/) library. Plays nicely with Turbolinks.
15
+ * Ships with two basic CSS themes (default & dark) — or write your own
15
16
 
16
17
  ## Requirements
17
18
 
18
- Abraham needs to know the current user to track tour views, e.g. `current_user` from Devise.
19
+ * Abraham needs to know the current user to track tour views, e.g. `current_user` from Devise.
20
+ * If you are using a different method to identify who is currently logged in, you can, for example, add an alias to make it work. Assuming you have a method `current_foo` to identify your currenly logged-in user, you can add `alias_method 'current_user', 'current_foo'` in the place you define `current_foo`.
21
+ * Abraham is tested on Rails 5.2, 6.0, and 6.1
19
22
 
20
23
  ## Installation
21
24
 
@@ -37,7 +40,7 @@ $ rails db:migrate
37
40
  Install the JavaScript dependencies:
38
41
 
39
42
  ```
40
- $ yarn add jquery@^3.4.0 js-cookie@^2.2.0 shepherd.js@^6.0.0-beta
43
+ $ yarn add js-cookie@^2.2.0 shepherd.js@^6.0.0-beta
41
44
  ```
42
45
 
43
46
  Require `abraham` in `app/assets/javascripts/application.js`
@@ -76,12 +79,15 @@ Tell Abraham where to insert its generated JavaScript in `app/views/layouts/appl
76
79
 
77
80
  ## Defining your tours
78
81
 
79
- Define your tours in the `config/tours` directory. Its directory structure should mirror your application's controllers, and the tour files should mirror your actions/views.
82
+ Define your tours in the `config/tours` directory corresponding to the views defined in your application. Its directory structure mirrors your application's controllers, and the tour files mirror your actions/views. (As of version 2.4.0, Abraham respects controllers organized into modules.)
80
83
 
81
84
  ```
82
85
  config/
83
86
  └── tours/
84
- └── blog/
87
+ ├── admin/
88
+ │ └── articles/
89
+ │ └── edit.en.yml
90
+ ├── blog/
85
91
  │ ├── show.en.yml
86
92
  │ └── show.es.yml
87
93
  └── articles/
@@ -91,11 +97,15 @@ config/
91
97
  └── show.es.yml
92
98
  ```
93
99
 
94
- NB: You must specify a locale in the filename, even if you're only supporting one language.
100
+ For example, per above, when a Spanish-speaking user visits `/articles/`, they'll see the tours defined by `config/tours/articles/index.es.yml`.
101
+
102
+ (Note: You must specify a locale in the filename, even if you're only supporting one language.)
95
103
 
96
104
  ### Tour content
97
105
 
98
- A tour is composed of a series of steps. A step may have a title and must have a description. You may attach a step to a particular element on the page, and place the callout to the left, right, top, or bottom.
106
+ Within a tour file, each tour is composed of a series of **steps**. A step may have a `title` and must have `text`. You may attach a step to a particular element on the page, and place the callout in a particular position.
107
+
108
+ In this example, we define a tour called "intro" with 3 steps:
99
109
 
100
110
  ```yaml
101
111
  intro:
@@ -122,11 +132,81 @@ Abraham takes care of which buttons should appear with each step:
122
132
  * "Exit" and "Next" buttons on intermediate steps
123
133
  * "Done" button on the last step
124
134
 
135
+ See below for how to define custom buttons.
136
+
137
+ When you specify an `attachTo` element, use the `placement` option to choose where the callout should appear relative to that element:
138
+
139
+ * `bottom` / `bottom center`
140
+ * `bottom left`
141
+ * `bottom right`
142
+ * `center` / `middle` / `middle center`
143
+ * `left` / `middle left`
144
+ * `right` / `middle right`
145
+ * `top` / `top center`
146
+ * `top left`
147
+ * `top right`
148
+
125
149
  Abraham tries to be helpful when your tour steps attach to page elements that are missing:
126
150
 
127
151
  * If your first step is attached to a particular element, and that element is not present on the page, the tour won't start. ([#28](https://github.com/actmd/abraham/issues/28))
128
152
  * If your tour has an intermediate step attached to a missing element, Abraham will skip that step and automatically show the next. ([#6](https://github.com/actmd/abraham/issues/6))
129
153
 
154
+ ### Automatic vs. manual tours
155
+
156
+ By default, Abraham will automatically start a tour that the current user hasn't seen yet.
157
+ You can instead define a tour to be triggered manually using the `trigger` option:
158
+
159
+ ```yml
160
+ walkthrough:
161
+ trigger: "manual"
162
+ steps:
163
+ 1:
164
+ text: "This walkthrough will show you how to..."
165
+ ```
166
+
167
+ This tour will not start automatically; instead, use the `Abraham.startTour` method with the tour name:
168
+
169
+ ```
170
+ <button id="startTour">Start tour</button>
171
+
172
+ <script>
173
+ document.querySelector("#startTour").addEventListener("click", function() {
174
+ Abraham.startTour("walkthrough"));
175
+ });
176
+ </script>
177
+ ```
178
+
179
+ ...or if you happen to use jQuery:
180
+
181
+ ```
182
+ <script>
183
+ $("#startTour").on("click", function() { Abraham.startTour('walkthrough'); })
184
+ </script>
185
+ ```
186
+
187
+ ### Custom buttons
188
+
189
+ You can define custom buttons in a step like so:
190
+
191
+ ```
192
+ my_tour:
193
+ steps:
194
+ 1:
195
+ text: "Welcome to my custom button tour"
196
+ buttons:
197
+ 1:
198
+ text: 'Show this to me later'
199
+ action: 'cancel'
200
+ classes: 'custom-button shepherd-button-secondary'
201
+ 2:
202
+ text: 'Finish now'
203
+ action: 'complete'
204
+ classes: 'custom-button'
205
+ ```
206
+
207
+ * `action` is one of the Shepherd tour method names, i.e. `cancel`, `next`, or `complete`
208
+ * `classes` are the CSS class names you want applied to the button
209
+
130
210
  ### Testing your tours
131
211
 
132
212
  Abraham loads tour definitions once when you start your server. Restart your server to see tour changes.
@@ -141,11 +221,22 @@ end
141
221
 
142
222
  ## Full example
143
223
 
144
- We provide a [small example app](https://github.com/actmd/abraham-example) that implements abraham, so you can see it in action.
224
+ We provide a [small example app](https://github.com/actmd/abraham-example) that implements Abraham, so you can see it in action.
145
225
 
146
- ## Upgrading from version 1
226
+ ## Upgrading
147
227
 
148
- Abraham v1 was built using Shepherd 1.8, v2 now uses Shepherd 6 -- quite a jump, yes.
228
+ ### From version 2.3.0 or earlier
229
+
230
+ Abraham 2.4.0 introduced an updated initializer that supports controllers organized into modules.
231
+ Rerun the generator with these options to replace the old initializer:
232
+
233
+ ```
234
+ $ rails generate abraham:install --skip-migration --skip-config
235
+ ```
236
+
237
+ ### From version 1
238
+
239
+ Abraham v1 was built using Shepherd 1.8, v2 now uses Shepherd 6 – quite a jump, yes.
149
240
 
150
241
  If you were using Abraham v1, you'll want to take the following steps to upgrade:
151
242
 
@@ -161,10 +252,26 @@ If you have any trouble at all, please [submit an issue](https://github.com/actm
161
252
 
162
253
  Contributions are welcome!
163
254
 
164
- Create a feature branch (using git-flow) and submit as a pull request.
255
+ Create a feature branch (using git-flow) and submit as a pull request (with a base branch of `develop`).
165
256
 
166
257
  Everyone interacting in Abraham's codebase, issue tracker, etc. is expected to follow the [Contributor Covenent Code of Conduct](https://www.contributor-covenant.org/version/1/4/code-of-conduct).
167
258
 
259
+ ### Getting started with the source code
260
+
261
+ Abraham uses `rvm` with a gemset to ensure the appropriate version of Ruby and its dependencies. Make sure that's installed before you get started.
262
+
263
+ ```
264
+ ~ git clone git@github.com:actmd/abraham.git
265
+ Cloning into 'abraham'...
266
+ ~ cd abraham
267
+ ruby-2.5.3 - #gemset created /Users/jon/.rvm/gems/ruby-2.5.3@abraham
268
+ ruby-2.5.3 - #generating abraham wrappers - please wait
269
+ ~ bundle install
270
+ Bundle complete! 13 Gemfile dependencies, 73 gems now installed.
271
+ Use `bundle info [gemname]` to see where a bundled gem is installed.
272
+ ~ yarn install
273
+ ```
274
+
168
275
  ### Testing
169
276
 
170
277
  #### Testing locally
@@ -183,7 +290,7 @@ gem 'abraham', path: '~/Workspace/abraham'
183
290
 
184
291
  #### Automated testing
185
292
 
186
- We use TravisCI to automatically test this engine with Rails 5.1, 5.2, and 6.0. For test history, venture over to [TravisCI](https://travis-ci.com/actmd/abraham).
293
+ We use GitHub Actions to automatically test this engine with Rails 5.2, 6.0, and 6.1.
187
294
 
188
295
  ### Releasing
189
296
 
data/Rakefile CHANGED
@@ -26,10 +26,10 @@ require "bundler/gem_tasks"
26
26
  require "rake/testtask"
27
27
 
28
28
  Rake::TestTask.new(:test) do |t|
29
- t.libs << "lib"
30
29
  t.libs << "test"
31
30
  t.pattern = "test/**/*_test.rb"
32
31
  t.verbose = false
32
+ t.warning = false
33
33
  end
34
34
 
35
35
  task default: :test
@@ -1,8 +1,28 @@
1
- //= require jquery
2
1
  //= require js-cookie/src/js.cookie
3
2
  //= require shepherd.js/dist/js/shepherd
4
3
 
5
- $(document).on('turbolinks:before-cache', function() {
6
- // Remove visible product tours
7
- $(".shepherd-step").remove();
4
+ var Abraham = new Object();
5
+
6
+ Abraham.tours = {};
7
+ Abraham.incompleteTours = [];
8
+ Abraham.startTour = function(tourName) {
9
+ if (!Shepherd.activeTour) {
10
+ Abraham.tours[tourName].start();
11
+ }
12
+ };
13
+ Abraham.startNextIncompleteTour = function() {
14
+ if (Abraham.incompleteTours.length) {
15
+ Abraham.tours[Abraham.incompleteTours[0]].checkAndStart();
16
+ }
17
+ };
18
+
19
+ document.addEventListener("DOMContentLoaded", Abraham.startNextIncompleteTour);
20
+ document.addEventListener("turbolinks:load", Abraham.startNextIncompleteTour);
21
+
22
+ document.addEventListener('turbolinks:before-cache', function() {
23
+ // Remove visible product tours
24
+ document.querySelectorAll(".shepherd-element").forEach(function(el) { el.remove() });
25
+ // Clear Abraham data
26
+ Abraham.tours = {};
27
+ Abraham.incompleteTours = [];
8
28
  });
@@ -15,7 +15,6 @@ class AbrahamHistoriesController < ApplicationController
15
15
 
16
16
  private
17
17
 
18
- # Never trust parameters from the scary internet, only allow the white list through.
19
18
  def abraham_history_params
20
19
  params.require(:abraham_history).permit(:controller_name, :action_name, :tour_name)
21
20
  end
@@ -3,29 +3,37 @@
3
3
  module AbrahamHelper
4
4
  def abraham_tour
5
5
  # Do we have tours for this controller/action in the user's locale?
6
- tours = Rails.configuration.abraham.tours["#{controller_name}.#{action_name}.#{I18n.locale}"]
7
-
8
- tours ||= Rails.configuration.abraham.tours["#{controller_name}.#{action_name}.#{I18n.default_locale}"]
6
+ tours = Rails.configuration.abraham.tours["#{controller_path}.#{action_name}.#{I18n.locale}"]
7
+ # Otherwise, default to the default locale
8
+ tours ||= Rails.configuration.abraham.tours["#{controller_path}.#{action_name}.#{I18n.default_locale}"]
9
9
 
10
10
  if tours
11
+ # Have any automatic tours been completed already?
11
12
  completed = AbrahamHistory.where(
12
13
  creator_id: current_user.id,
13
- controller_name: controller_name,
14
+ controller_name: controller_path,
14
15
  action_name: action_name
15
16
  )
16
- remaining = tours.keys - completed.map(&:tour_name)
17
17
 
18
- if remaining.any?
19
- # Generate the javascript snippet for the next remaining tour
20
- render(partial: "application/abraham",
21
- locals: { tour_name: remaining.first,
22
- steps: tours[remaining.first]["steps"] })
18
+ tour_keys_completed = completed.map(&:tour_name)
19
+ tour_keys = tours.keys
20
+
21
+ tour_html = ''
22
+
23
+ tour_keys.each do |key|
24
+ tour_html += render(partial: "application/abraham",
25
+ locals: { tour_name: key,
26
+ tour_completed: tour_keys_completed.include?(key),
27
+ trigger: tours[key]["trigger"],
28
+ steps: tours[key]["steps"] })
23
29
  end
30
+
31
+ tour_html.html_safe
24
32
  end
25
33
  end
26
34
 
27
35
  def abraham_cookie_prefix
28
- "abraham-#{fetch_application_name.to_s.underscore}-#{current_user.id}-#{controller_name}-#{action_name}"
36
+ "abraham-#{fetch_application_name.to_s.underscore}-#{current_user.id}-#{controller_path}-#{action_name}"
29
37
  end
30
38
 
31
39
  def fetch_application_name
@@ -36,7 +44,6 @@ module AbrahamHelper
36
44
  end
37
45
  end
38
46
 
39
-
40
47
  def abraham_domain
41
48
  request.host
42
49
  end
@@ -1,70 +1,81 @@
1
1
  <script>
2
- var tour = new Shepherd.Tour(<%= Rails.configuration.abraham.tour_options.html_safe unless Rails.configuration.abraham.tour_options.nil? %>);
2
+ Abraham.tours["<%= tour_name %>"] = new Shepherd.Tour(<%= Rails.configuration.abraham.tour_options.html_safe unless Rails.configuration.abraham.tour_options.nil? %>);
3
3
 
4
- tour.on("complete", function() {
5
- // ajax
6
- return $.ajax({
7
- url: "/abraham_histories/",
8
- type: "POST",
9
- dataType: "json",
10
- contentType: "application/json",
11
- data: JSON.stringify({
4
+ <% if trigger != 'manual' %>
5
+ Abraham.tours["<%= tour_name %>"].on("complete", function() {
6
+ // Make AJAX call to save history of tour completion
7
+ return fetch("/abraham_histories/", {
8
+ method: "POST",
9
+ headers: { 'Content-Type': 'application/json' },
10
+ body: JSON.stringify({
12
11
  authenticity_token: '<%= form_authenticity_token %>',
13
- controller_name: '<%= controller_name %>',
12
+ controller_name: '<%= controller_path %>',
14
13
  action_name: '<%= action_name %>',
15
14
  tour_name: '<%= tour_name %>'
16
15
  })
17
16
  });
18
17
  });
19
18
 
20
- tour.on("cancel", function() {
19
+ Abraham.tours["<%= tour_name %>"].on("cancel", function() {
21
20
  Cookies.set('<%= abraham_cookie_prefix %>-<%= tour_name %>', 'later', { domain: '<%= abraham_domain %>' });
22
21
  });
22
+ <% end %>
23
23
 
24
24
  <% steps.each_with_index do |(key, step), index| %>
25
- tour.addStep({
25
+ Abraham.tours["<%= tour_name %>"].addStep({
26
26
  id: 'step-<%= key %>',
27
27
  <% if step.key?('title') %>
28
28
  title: "<%= step['title'] %>",
29
29
  <% end %>
30
30
  text: "<%= step['text'] %>",
31
31
  <% if step.key?('attachTo') %>
32
- attachTo: { element: "<%= step['attachTo']['element'] %>", on: "<%= step['attachTo']['placement'] %>" },
32
+ attachTo: { element: "<%= escape_javascript(step['attachTo']['element'].html_safe) %>", on: "<%= step['attachTo']['placement'] %>" },
33
33
  showOn: function() {
34
34
  // Only display this step if its selector is present
35
- return document.querySelector("<%= step['attachTo']['element'] %>") ? true : false
35
+ return document.querySelector("<%= escape_javascript(step['attachTo']['element'].html_safe) %>") ? true : false
36
36
  },
37
37
  <% end %>
38
38
  buttons: [
39
- <% if index == 0 %>
40
- { text: '<%= t('abraham.later') %>', action: tour.cancel, classes: 'shepherd-button-secondary' },
41
- { text: '<%= t('abraham.continue') %>', action: tour.next }
39
+ <% if step.key?('buttons') %>
40
+ <% step['buttons'].each do |button| %>
41
+ { text: '<%= button[1]['text'] %>', action: Abraham.tours["<%= tour_name %>"].<%= button[1]['action'] %>, classes: '<%= button[1]['classes'] %>' },
42
+ <% end %>
42
43
  <% else %>
43
- <% if index == steps.size - 1 %>
44
- { text: '<%= t('abraham.done') %>', action: tour.complete }
44
+ <% if index == steps.size - 1 %>
45
+ { text: '<%= t('abraham.done') %>', action: Abraham.tours["<%= tour_name %>"].complete }
46
+ <% else %>
47
+ <% if index == 0 %>
48
+ { text: '<%= t('abraham.later') %>', action: Abraham.tours["<%= tour_name %>"].cancel, classes: 'shepherd-button-secondary' },
49
+ { text: '<%= t('abraham.continue') %>', action: Abraham.tours["<%= tour_name %>"].next }
45
50
  <% else %>
46
- { text: '<%= t('abraham.exit') %>', action: tour.cancel, classes: 'shepherd-button-secondary' },
47
- { text: '<%= t('abraham.next') %>', action: tour.next }
51
+ { text: '<%= t('abraham.exit') %>', action: Abraham.tours["<%= tour_name %>"].cancel, classes: 'shepherd-button-secondary' },
52
+ { text: '<%= t('abraham.next') %>', action: Abraham.tours["<%= tour_name %>"].next }
48
53
  <% end %>
54
+ <% end %>
49
55
  <% end %>
50
56
  ]
51
57
  });
52
58
  <% end %>
53
59
 
54
- tour.start = function (start) {
55
- return function () {
56
- // Don't start the tour if the user dismissed it once this session
57
- var tourMayStart = !Cookies.get('<%= abraham_cookie_prefix %>-<%= tour_name %>', {domain: '<%= abraham_domain %>'});
58
- <% if steps.first[1]['attachTo'] %>
59
- // Don't start the tour if the first step's element is missing
60
- tourMayStart = tourMayStart && document.querySelector("<%= steps.first[1]['attachTo']['element'] %>");
61
- <% end %>
62
-
63
- if (tourMayStart) {
64
- start();
60
+ <% if trigger != "manual" %>
61
+ Abraham.tours["<%= tour_name %>"].checkAndStart = function (start) {
62
+ return function () {
63
+ // Don't start the tour if the user dismissed it once this session
64
+ var tourMayStart = !Cookies.get('<%= abraham_cookie_prefix %>-<%= tour_name %>', {domain: '<%= abraham_domain %>'});
65
+ <% if steps.first[1]['attachTo'] %>
66
+ // Don't start the tour if the first step's element is missing
67
+ tourMayStart = tourMayStart && document.querySelector("<%= steps.first[1]['attachTo']['element'] %>");
68
+ <% end %>
69
+
70
+ if (tourMayStart) {
71
+ start();
72
+ }
65
73
  }
66
- }
67
- }(tour.start)
74
+ }(Abraham.tours["<%= tour_name %>"].start)
75
+
76
+ <% if !tour_completed %>
77
+ Abraham.incompleteTours.push("<%= tour_name %>");
78
+ <% end %>
79
+ <% end %>
68
80
 
69
- tour.start()
70
81
  </script>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Abraham
4
- VERSION = "2.1.2"
4
+ VERSION = "2.5.0"
5
5
  end
@@ -10,6 +10,7 @@ module Abraham
10
10
 
11
11
  class_option :'skip-migration', type: :boolean, desc: "Don't generate a migration for the histories table"
12
12
  class_option :'skip-initializer', type: :boolean, desc: "Don't generate an initializer"
13
+ class_option :'skip-config', type: :boolean, desc: "Don't generate a config file"
13
14
 
14
15
  source_root File.expand_path(File.join(File.dirname(__FILE__), "templates"))
15
16
 
@@ -24,6 +25,11 @@ module Abraham
24
25
  return if options["skip-initializer"]
25
26
 
26
27
  copy_file "initializer.rb", "config/initializers/abraham.rb"
28
+ end
29
+
30
+ def create_config
31
+ return if options["skip-config"]
32
+
27
33
  copy_file "abraham.yml", "config/abraham.yml"
28
34
  end
29
35
  end
@@ -2,18 +2,18 @@
2
2
 
3
3
  Rails.application.configure do
4
4
  tours = {}
5
+ tours_root = Pathname.new(Rails.root.join("config/tours"))
5
6
 
6
- if Rails.root.join('config/tours').exist?
7
- Dir[Rails.root.join('config/tours/*/')].each do |dir|
8
- Dir[dir + '*.yml'].each do |yml|
9
- path_parts = yml.split(File::SEPARATOR)
10
- controller = path_parts[path_parts.size - 2]
11
- file_parts = path_parts[path_parts.size - 1].split('.')
12
- action = file_parts[0]
13
- locale = file_parts[1]
14
- t = YAML.load_file(yml)
15
- tours["#{controller}.#{action}.#{locale}"] = t
16
- end
7
+ if Rails.root.join("config/tours").exist?
8
+ Dir.glob(Rails.root.join("config/tours/**/*.yml")).each do |yml|
9
+ relative_filename = Pathname.new(yml).relative_path_from(tours_root)
10
+ # `controller_path` is either "controller_name" or "module_name/controller_name"
11
+ controller_path, filename = relative_filename.split
12
+ file_parts = filename.to_s.split(".")
13
+ action = file_parts[0]
14
+ locale = file_parts[1]
15
+ t = YAML.load_file(yml)
16
+ tours["#{controller_path}.#{action}.#{locale}"] = t
17
17
  end
18
18
  end
19
19
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abraham
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Abbett
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-22 00:00:00.000000000 Z
11
+ date: 2022-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sassc-rails
@@ -115,7 +115,7 @@ homepage: https://github.com/actmd/abraham
115
115
  licenses:
116
116
  - MIT
117
117
  metadata: {}
118
- post_install_message:
118
+ post_install_message:
119
119
  rdoc_options: []
120
120
  require_paths:
121
121
  - lib
@@ -130,9 +130,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  requirements: []
133
- rubyforge_project:
134
- rubygems_version: 2.7.6
135
- signing_key:
133
+ rubygems_version: 3.0.8
134
+ signing_key:
136
135
  specification_version: 4
137
136
  summary: Trackable application tours for Rails with i18n support, based on Shepherd.js.
138
137
  test_files: []