precedences 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7a84c172e64b8c245d28b5b61fc6971242e5e4754ebe5de552a4b6af27b33014
4
+ data.tar.gz: 5e43bfe49c64c21b8ab134330f922bc4820dd66c9eceec6b45f36245d208467b
5
+ SHA512:
6
+ metadata.gz: 5a0600fae85efe979be58a31250bd0d983b9163305e2e2ba5c3dba9d39ab91ca5cb5203360ec7540ce9d3a50313ddab67d684bf05cbb8a2b4ccefd86007872d0
7
+ data.tar.gz: ee8ca855b132b278b78b4d84e3933821a4e6e0094069b7f1855af81c5938a0b73fcac6ccd20d42be0380f54637bb9430981ffec2097d5fccbdb9f6d094bb9bc7
data/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ .DS_Store
2
+
3
+ .precedences
4
+ *.precedences
5
+
6
+ /.bundle/
7
+ /.yardoc
8
+ /_yardoc/
9
+ /coverage/
10
+ /doc/
11
+ /pkg/
12
+ /spec/reports/
13
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.7.3
6
+ before_install: gem install bundler -v 2.1.4
data/CHANGELOG ADDED
@@ -0,0 +1,43 @@
1
+ # 1.4.1
2
+
3
+ - option :filter à true pour le TTY::select
4
+
5
+ # 1.4.0
6
+
7
+ - On peut appeler `set_precedence` avec un fichier pour une utilisation sans pré-traitement.
8
+
9
+ # 1.3.2
10
+
11
+ - Traitement plus fin du nom du fichier enregistrant les précédences
12
+
13
+ # 1.3.1
14
+
15
+ - correction du bug sur le check des choices (on prend le premier
16
+ au lieu du deuxième qui pourrait ne pas exister)
17
+
18
+ # 1.3.0
19
+
20
+ - Possibilité de faire Control-C pour interrompre (annuler)
21
+ - Cancel en orange
22
+
23
+ # 1.2.0
24
+
25
+ - Ajout d'un menu Cancel/Renoncer à la demande.
26
+
27
+ # 1.1.1
28
+
29
+ - Quelques corrections
30
+
31
+ # 1.1.0
32
+
33
+ - Option :precedences_per_index pour pouvoir utiliser n'importe
34
+ quel type de value, mais un enregistrement des précédences par
35
+ index.
36
+
37
+ # 1.0.1
38
+
39
+ - :value of a choice can be nil.
40
+
41
+ # 1.0.0
42
+
43
+ - First operational release.
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in precedences.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "minitest", "~> 5.0"
8
+ gem "clir", ">= 0.16"
data/Gemfile.lock ADDED
@@ -0,0 +1,43 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ precedences (1.4.1)
5
+ clir (>= 0.16)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ clir (0.22.1)
11
+ json
12
+ tty-prompt
13
+ json (2.6.3)
14
+ minitest (5.20.0)
15
+ minitest-color (0.0.2)
16
+ minitest (~> 5)
17
+ pastel (0.8.0)
18
+ tty-color (~> 0.5)
19
+ rake (12.3.3)
20
+ tty-color (0.6.0)
21
+ tty-cursor (0.7.1)
22
+ tty-prompt (0.23.1)
23
+ pastel (~> 0.8)
24
+ tty-reader (~> 0.8)
25
+ tty-reader (0.9.0)
26
+ tty-cursor (~> 0.7)
27
+ tty-screen (~> 0.8)
28
+ wisper (~> 2.0)
29
+ tty-screen (0.8.1)
30
+ wisper (2.0.1)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ clir (>= 0.16)
37
+ minitest (~> 5.0)
38
+ minitest-color
39
+ precedences!
40
+ rake (~> 12.0)
41
+
42
+ BUNDLED WITH
43
+ 2.1.4
@@ -0,0 +1,170 @@
1
+ # Precedences
2
+
3
+ Gestion de précédences dans les listes de choix pour `Tty-Prompt#select`.
4
+
5
+ Deux modes d'utilisation sont possibles.
6
+
7
+ Le plus simple, par block :
8
+
9
+ ~~~ruby
10
+ require 'precedences'
11
+
12
+ #
13
+ # Tty-prompt#select choices
14
+ #
15
+ choices = [
16
+ {name:"Choix premier", value: :first},
17
+ {name:"Deuxième choix", value: :second}
18
+ ]
19
+
20
+ #
21
+ # Fichier où les précédences seront enregistrées
22
+ #
23
+ precfile = File.join(__dir__, '.precedences')
24
+
25
+ choix = precedencize(choices, precfile) do |q|
26
+ q.question "Choisir la valeur :"
27
+ end
28
+
29
+ ~~~
30
+
31
+ `choix` contiendra la valeur choisie, soit `:first` soit `:second`.
32
+
33
+ Le second mode d'utilisation fonctionne sans bloc, avec les valeurs par défaut :
34
+
35
+ ~~~ruby
36
+ require 'precedences'
37
+
38
+ ##
39
+ # On définit choices et prefile de la même façon
40
+ # puis…
41
+
42
+ choices = precedencize(choices, precfile)
43
+
44
+ choix = Q.select("Choisir parmi : ", choices)
45
+ #
46
+ # Pour enregistrer cette précédence (ne pas l'oublier !)
47
+ #
48
+ set_precedence(choix)
49
+
50
+ # ...
51
+ ~~~
52
+
53
+ On peut même considérer un troisième bloc qui utilise juste la méthode `set_precedence(choix, fichier)` quand le traitement du choix se fait ailleurs. Typiquement, on l’utilise quand la valeur peut être transmise directement au script, par exemple en ligne de commande.
54
+
55
+ ~~~ruby
56
+ require 'precedences'
57
+
58
+ choix = ARGV[0] || demande_la_valeur_du_choix || return
59
+
60
+ set_precedence(choix, "<file/to/precedences_file>")
61
+ ~~~
62
+
63
+
64
+
65
+ ## Valeurs possibles
66
+
67
+ Dans l'utilisation normale, l'attribut `:value` des choices doit obligatoirement être de type `String`, `Symbol` ou `Numeric`, mais avec l’option `precedences_per_index`, il est possible d’utiliser n’importe quelle valeur (note : l’ordre est alors mémorisé par index — ce qui signifie qu’il ne faut pas modifier la liste en cours de route).
68
+
69
+ Par exemple :
70
+
71
+ ~~~ruby
72
+ require 'precedences'
73
+
74
+ #
75
+ # Des choix avec des valeurs spéciales
76
+ #
77
+ choices = [
78
+ {name:"La classe Integer" , value: Integer},
79
+ {name:"La classe Array" , value: Array},
80
+ {name:"La classe Hash" , value: Hash},
81
+ ]
82
+
83
+ choix = precedencize(choices, file) do |q|
84
+ q.question "Choisis une classe"
85
+ q.precedences_per_index # <=== option pour que ça passe
86
+ end
87
+ ~~~
88
+
89
+
90
+
91
+ ## Options possibles
92
+
93
+ En mode block, on peut définir plusieurs choses :
94
+
95
+ ~~~ruby
96
+ require 'precedences'
97
+
98
+ choix = precedencize(choices, precfile) do |q|
99
+ #
100
+ # La question
101
+ #
102
+ q.question = "Ma question"
103
+ # ou
104
+ q.question "Ma question"
105
+
106
+ #
107
+ # Le nombre de menus affichés
108
+ # (noter que par défaut, tous les menus sont affichés, contrairement
109
+ # à tty-prompt qui les limite toujours)
110
+ #
111
+ q.per_page 5
112
+ # ou q.per_page = 5
113
+
114
+ #
115
+ # L'affichage ou non de l'aide (:never par défaut)
116
+ #
117
+ q.show_help = :always
118
+ # ou
119
+ q.show_help :start
120
+
121
+ #
122
+ # Le message d'aide à afficher
123
+ #
124
+ q.help = "Mon message d'aide"
125
+ # ou
126
+ q.help "Message d'aide"
127
+
128
+ #
129
+ # La valeur sélectionnée par défaut (lorsqu'il faut passer
130
+ # outre l'ordre de précédence par exemple)
131
+ # Cette valeur peut être passée par…
132
+ #
133
+ # Par index 1-based explicite
134
+ q.default = 4
135
+ # ou q.default 4
136
+ #
137
+ # Par valeur du :value
138
+ q.default = :second
139
+ # ou q.default :second
140
+ #
141
+ # Par extrait du name (ou name exact)
142
+ q.default = "premier"
143
+ # ou q.default "premier"
144
+ # => Sélectionnera le choix "Choix premier"
145
+
146
+ end
147
+
148
+ ~~~
149
+
150
+ #### Ajouter un menu “Renoncer”
151
+
152
+ ~~~ruby
153
+ choix = precedencize(choices, file) do |q|
154
+ q.add_choice_cancel(:up, {value: :cancel, name: "Renoncer"})
155
+ end
156
+ ~~~
157
+
158
+ Si on doit utiliser les valeurs par défaut que sont :
159
+
160
+ * `:name` est “Cancel”
161
+ * `:value` est `nil`
162
+ * position est `:down` alors on peut faire simplement
163
+
164
+ ~~~ruby
165
+ choix = precedencize(choices, file) do |q|
166
+ q.add_choice_cancel
167
+ end
168
+ ~~~
169
+
170
+ > 😃 Noter qu’on peut en fait se servir de ce menu pour ajouter n’importe quel autre menu que “Renoncer”.
Binary file
data/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # Precedences
2
+
3
+ Deal with order of items in a select list of TTY-Prompt, applying the "last is the first" principle. Hence, last choice in the list will always be the first in the future.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'precedences'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle install
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install precedences
20
+
21
+ ## Usage
22
+
23
+ ~~~ruby
24
+ require 'precedences'
25
+
26
+ choices = [
27
+ {name:"First choix", value: :first},
28
+ {name:"Second choix", value: :second},
29
+ {name:"Third choix", value: :third},
30
+ ]
31
+
32
+ myfile = File.join(__dir__, 'my.precedences')
33
+
34
+ choix = precedencize(choices, myfile) do |q|
35
+ q.question "Choose a item among:"
36
+ end
37
+
38
+ ~~~
39
+
40
+ With the code above, the first time, the list will display:
41
+
42
+ ~~~
43
+ > First choix
44
+ Second choix
45
+ Third choix
46
+ ~~~
47
+
48
+ I choose "Second choix":
49
+
50
+ ~~~
51
+ First choix
52
+ > Second choix
53
+ Third choix
54
+ ~~~
55
+
56
+ The next time I use the command, the list will display:
57
+
58
+ ~~~
59
+ > Second choix
60
+ First choix
61
+ Third choix
62
+ ~~~
63
+
64
+ Then I choose "Third choix":
65
+
66
+ ~~~
67
+ Second choix
68
+ First choix
69
+ > Third choix
70
+ ~~~
71
+
72
+ The next time I use the command, the list displayed should be:
73
+
74
+ ~~~
75
+ > Third choix
76
+ Second choix
77
+ First choix
78
+ ~~~
79
+
80
+
81
+ ## Development
82
+
83
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
84
+
85
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
86
+
87
+ ## Contributing
88
+
89
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/precedences.
90
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "precedences"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,16 @@
1
+
2
+
3
+ def precedencize(choices, filename, &block)
4
+ prec = Clir::Precedence.new(filename)
5
+ Clir::Precedence.current = prec
6
+ return prec.sort(choices, &block)
7
+ end
8
+
9
+ def set_precedence(choix, filename = nil)
10
+ prec = if filename.nil?
11
+ Clir::Precedence.current
12
+ else
13
+ Clir::Precedence.new(filename)
14
+ end
15
+ prec.send(:set_precedences_ids, choix)
16
+ end
@@ -0,0 +1,330 @@
1
+ module Clir
2
+ class Precedence
3
+
4
+ ################### CLASSE ###################
5
+ class << self
6
+
7
+ attr_accessor :current
8
+
9
+ end #/<< self
10
+ ################### INSTANCE ###################
11
+
12
+ attr_reader :filepath
13
+
14
+ def initialize(filepath)
15
+ @filepath = filepath
16
+ filepath_validize_or_raises
17
+ # --- Default values ---
18
+ @question = "Choose:"
19
+ @show_help = nil
20
+ @help = ''
21
+ @per_page = nil
22
+ @default = 1
23
+ @precedences_per_index = false
24
+ @add_choice_cancel = nil
25
+ end
26
+
27
+ def sort(choices_ini, &block)
28
+
29
+ #
30
+ # On doit évaluer le bloc ici car certaines valeurs peuvent
31
+ # modifier le comportement de la suite.
32
+ # Par exemple, si @precedences_per_index a été mis à true,
33
+ # on peut permettre n'importe quel type de :value dans les
34
+ # hash
35
+ if block_given?
36
+ block.call(self)
37
+ end
38
+
39
+ #
40
+ # List of choices must be valid
41
+ #
42
+ choices_valid_or_raises(choices_ini)
43
+
44
+ #
45
+ # Use a clone rather than original list to leave the initial
46
+ # list of choices alone.
47
+ #
48
+ choices = choices_ini.dup
49
+
50
+ #
51
+ # Sort the list of choices
52
+ # (and treate other choices — add cancel, etc.)
53
+ #
54
+ choices = prepare_choices(choices)
55
+
56
+ if block_given?
57
+ #
58
+ # Tty-select options
59
+ #
60
+ options = define_tty_options(choices)
61
+ #
62
+ # On procède au choix
63
+ #
64
+ begin
65
+ choix = Q.select(question.jaune, choices, **options)
66
+ rescue TTY::Reader::InputInterrupt
67
+ # Annulation par ^C
68
+ return nil
69
+ end
70
+ #
71
+ # On enregistre ce choix (sauf si null ou :cancel)
72
+ #
73
+ set_precedence(choix) unless choix.nil? || choix == :cancel
74
+ #
75
+ # On retourne le choix
76
+ #
77
+ return choix
78
+ else
79
+ #
80
+ # Sinon, sans block, on renvoie la liste classée
81
+ #
82
+ return choices
83
+ end
84
+ end
85
+
86
+ # --- Predicate Methods ---
87
+
88
+ def precedences_per_index?
89
+ @precedences_per_index === true
90
+ end
91
+
92
+ def add_choice_cancel?
93
+ not(@add_choice_cancel.nil?)
94
+ end
95
+
96
+ # --- Tty prompt Methods ---
97
+
98
+ def question(quest = nil)
99
+ @question = quest unless quest.nil?
100
+ return @question
101
+ end
102
+ def question=(quest) ; question(quest) end
103
+
104
+ def per_page(value = nil)
105
+ @per_page = value unless value.nil?
106
+ return @per_page
107
+ end
108
+ def per_page=(value); per_page(value) end
109
+
110
+ def show_help(value = nil)
111
+ @show_help = value unless value === nil
112
+ return @show_help
113
+ end
114
+ def show_help=(value) ; show_help(value) end
115
+
116
+ def default(value = nil)
117
+ @default = value unless value.nil?
118
+ return @default
119
+ end
120
+ def default=(value) ; default(value) end
121
+
122
+ def help(value = nil)
123
+ @help = value unless value.nil?
124
+ return @help
125
+ end
126
+ def help=(value) ; help(value) end
127
+
128
+ def precedences_per_index(value = nil)
129
+ if value === false
130
+ @precedences_per_index = false
131
+ else
132
+ @precedences_per_index = true
133
+ end
134
+ return @precedences_per_index
135
+ end
136
+ def precedences_per_index=(value) ; precedences_per_index(value) end
137
+
138
+ ##
139
+ # To add the cancel choice
140
+ #
141
+ def add_choice_cancel(where = :down, **params)
142
+ if where.is_a?(Hash)
143
+ params = where
144
+ where = nil
145
+ else
146
+ params ||= {}
147
+ end
148
+ params ||= {}
149
+ default_params = {value: nil, name: "Cancel", position: :down}
150
+ params = default_params.merge(params)
151
+ params.merge!(position: where.to_s.downcase.to_sym) unless where.nil?
152
+ params.merge!(name: params[:name].orange)
153
+ @add_choice_cancel = params
154
+ end
155
+
156
+ private
157
+
158
+ ##
159
+ # = main =
160
+ #
161
+ def prepare_choices(choices)
162
+ #
163
+ # Classement des choix par précédence
164
+ #
165
+ choices = sort_items(choices)
166
+ #
167
+ # Faut-il ajouter un choix cancel ?
168
+ #
169
+ if add_choice_cancel?
170
+ add_method = (@add_choice_cancel[:position] == :down) ? :push : :unshift
171
+ choices.send(add_method, @add_choice_cancel)
172
+ end
173
+ #
174
+ # On retourne les choix préparés
175
+ #
176
+ return choices
177
+ end
178
+ #
179
+ # Main method whose sort items
180
+ #
181
+ # @api private
182
+ def sort_items(choices)
183
+ return choices unless File.exist?(filepath)
184
+ prec_ids = get_precedences_ids
185
+ if precedences_per_index?
186
+ choices_copy = choices.dup
187
+ choices = prec_ids.map do |id|
188
+ item = choices_copy[id.to_i - 1]
189
+ choices_copy[id.to_i - 1] = nil
190
+ item
191
+ end
192
+ # On ajoute les choix restants
193
+ choices += choices_copy.compact
194
+ else
195
+ #
196
+ # Cas normal
197
+ #
198
+ choices.sort!{|a, b|
199
+ (prec_ids.index(a[:value].to_s)||10000) <=> (prec_ids.index(b[:value].to_s)||10000)
200
+ }
201
+ end
202
+ return choices
203
+ end
204
+
205
+ ##
206
+ # Define default tty-options (last parameter of select)
207
+ #
208
+ def define_tty_options(choices)
209
+ {
210
+ per_page: self.per_page || choices.count,
211
+ show_help: self.show_help ? :always : :never,
212
+ echo: nil,
213
+ help: self.help,
214
+ default: get_default_value_index(choices),
215
+ filter: true,
216
+ }
217
+ end
218
+
219
+ # Save the values order in filepath file
220
+ #
221
+ # @api private
222
+ def set_precedences_ids(value)
223
+ if precedences_per_index?
224
+ #
225
+ # Mémorisation des choix par index
226
+ # (:value de n'importe quel type, mais la liste original
227
+ # ne peut pas être changée)
228
+ #
229
+ @choices_ini.each_with_index do |choice, idx|
230
+ value = (idx + 1).to_s and break if choice[:value] == value
231
+ end
232
+ else
233
+ #
234
+ # Mémorisation des choix par valeur
235
+ # (plus fiable, la liste peut être changée)
236
+ #
237
+ value = value.to_s
238
+ end
239
+ pids = get_precedences_ids
240
+ pids.delete(value)
241
+ pids.unshift(value)
242
+ File.write(filepath, pids.join("\n"))
243
+ end
244
+
245
+ # Get the values sorted if filepath exists.
246
+ #
247
+ # @api private
248
+ def get_precedences_ids
249
+ @get_precedences_ids ||= begin
250
+ File.exist?(filepath) ? File.read(filepath).split("\n") : []
251
+ end
252
+ end
253
+
254
+ ##
255
+ # Check if given filepath (for saving order of choices) is valid.
256
+ # Raise an argument error otherwise.
257
+ # If it's a folder, set to .precedences file
258
+ #
259
+ # @api private
260
+ def filepath_validize_or_raises
261
+ File.exist?(File.dirname(filepath)) || raise(ArgumentError.new("Precedences incorrect file: its folder should exist."))
262
+ if File.exist?(filepath) && File.directory?(filepath)
263
+ @filepath = File.join(filepath, '.precedences')
264
+ elsif File.extname(filepath).empty? && !File.basename(filepath).start_with?('.')
265
+ @filepath = "#{filepath}.precedences"
266
+ end
267
+ end
268
+
269
+ ##
270
+ # Check if given choices are valid. Raise an ArgumentError otherwise
271
+ #
272
+ # @api private
273
+ def choices_valid_or_raises(choices)
274
+ #
275
+ # On en aura besoin
276
+ #
277
+ @choices_ini = choices.dup.freeze
278
+
279
+ choices.is_a?(Array) || raise(ArgumentError.new('Bad choices. Should be an Array.'))
280
+ choices.empty? && raise(ArgumentError.new("Bad choices. Shouldn't be empty." ))
281
+ choices[0].is_a?(Hash) || raise(ArgumentError.new('Bad choices. Should be an Array of Hash(s).'))
282
+ #
283
+ # To check unicity of values
284
+ #
285
+ cvalues = {}
286
+ #
287
+ # Check every choice
288
+ #
289
+ choices.each do |choice|
290
+ choice.key?(:name) || raise(ArgumentError.new("Bad choices. Every choice should define :name attribute."))
291
+ choice.key?(:value) || raise(ArgumentError.new("Bad choices. Every choice should define :value attribute."))
292
+ case choice[:value]
293
+ when Symbol, String, Numeric, NilClass then
294
+ val = choice[:value].to_s
295
+ if cvalues.key?(val)
296
+ raise ArgumentError.new("Bad choices. Value collision: #{choice[:value].inspect} and #{cvalues[val].inspect} are the same, for precedences.")
297
+ else
298
+ cvalues.merge!(val => choice[:value])
299
+ end
300
+ else
301
+ if precedences_per_index?
302
+ # ok, :value peut avoir n'importe quelle valeur
303
+ else
304
+ raise(ArgumentError.new("Bad choices. Attribute :value of choice should only be a String, a Symbol, a Numeric or NilClass. #{choice[:value]} is a #{choice[:value].class}. Add option q.precedences_per_index in block if init never changes."))
305
+ end
306
+ end
307
+ end
308
+ end
309
+
310
+ ##
311
+ # @return index (1-based) of default value if defined (even it's a
312
+ # bit silly with precedences…)
313
+ #
314
+ def get_default_value_index(choices)
315
+ return default if default.is_a?(Integer) && default > 0
316
+ #
317
+ # On recherche la valeur dans les choix (:name or :value)
318
+ #
319
+ choices.each_with_index do |choice, idx|
320
+ the_index = idx + 1
321
+ return the_index if choice[:value] == default
322
+ return the_index if choice[:name].match?(/#{default}/)
323
+ end
324
+ #
325
+ # Si on n'a rien trouvé, on s'en retourne avec le premier
326
+ #
327
+ return 1
328
+ end
329
+ end #/class Precedence
330
+ end #/module Clir
@@ -0,0 +1,3 @@
1
+ module Precedences
2
+ VERSION = "1.4.1"
3
+ end
@@ -0,0 +1,9 @@
1
+ require 'clir'
2
+ require "precedences/version"
3
+ require "precedences/precedence"
4
+ require "precedences/exposed"
5
+
6
+ module Precedences
7
+ class Error < StandardError; end
8
+ # Your code goes here...
9
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'lib/precedences/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "precedences"
5
+ s.version = Precedences::VERSION
6
+ s.authors = ["PhilippePerret"]
7
+ s.email = ["philippe.perret@yahoo.fr"]
8
+
9
+ s.summary = %q{Sort list with "the last is the first" principle}
10
+ s.description = %q{Tty-prompt extension to sort a list of choices along the "last is firts" principle.}
11
+ s.homepage = "https://rubygems.org/gems/precedences"
12
+ s.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
13
+
14
+ s.add_dependency 'clir', '>= 0.16'
15
+ s.add_development_dependency 'minitest'
16
+ s.add_development_dependency 'minitest-color'
17
+
18
+ s.metadata["allowed_push_host"] = "https://rubygems.org"
19
+
20
+ s.metadata["homepage_uri"] = s.homepage
21
+ s.metadata["source_code_uri"] = "https://github.com/PhilippePerret/precedences"
22
+ s.metadata["changelog_uri"] = "https://github.com/PhilippePerret/precedences/CHANGELOG"
23
+
24
+ # Specify which files should be added to the gem when it is released.
25
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
+ s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
27
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|features)/}) }
28
+ end
29
+ s.bindir = "exe"
30
+ s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ s.require_paths = ["lib"]
32
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: precedences
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.4.1
5
+ platform: ruby
6
+ authors:
7
+ - PhilippePerret
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-09-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: clir
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.16'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-color
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Tty-prompt extension to sort a list of choices along the "last is firts"
56
+ principle.
57
+ email:
58
+ - philippe.perret@yahoo.fr
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".travis.yml"
65
+ - CHANGELOG
66
+ - Gemfile
67
+ - Gemfile.lock
68
+ - Manual/Manuel-fr.md
69
+ - Manual/Manuel-fr.pdf
70
+ - README.md
71
+ - Rakefile
72
+ - bin/console
73
+ - bin/setup
74
+ - lib/precedences.rb
75
+ - lib/precedences/exposed.rb
76
+ - lib/precedences/precedence.rb
77
+ - lib/precedences/version.rb
78
+ - precedences.gemspec
79
+ homepage: https://rubygems.org/gems/precedences
80
+ licenses: []
81
+ metadata:
82
+ allowed_push_host: https://rubygems.org
83
+ homepage_uri: https://rubygems.org/gems/precedences
84
+ source_code_uri: https://github.com/PhilippePerret/precedences
85
+ changelog_uri: https://github.com/PhilippePerret/precedences/CHANGELOG
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 2.3.0
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubygems_version: 3.1.6
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Sort list with "the last is the first" principle
105
+ test_files: []