ix-cli 0.0.6 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dae9bc89f4291cfa7e06e18d9b154995746502273999407a9ec61260f58c94f8
4
- data.tar.gz: 2e6868c9b9adb7808264c72d9d9dc5c1f93981427a662c7efdc9aeaa015bab9b
3
+ metadata.gz: bb14cdf843c9b38f5aa771f23334ee0bb58ebcc6cd138c56ce2af5d02fbe283d
4
+ data.tar.gz: b09c43e5a377df98063a481d8ccefc95ee698b5fbee9416e95e5e9b6e19eb9bf
5
5
  SHA512:
6
- metadata.gz: c371b7203b29f4efefae471e95adf1c1ee70cd1fdb0e071ba643438e629beb4291795b0b694e389dde7050dd28ae0e185fb5929cc950c50c32b51abbfe906b0b
7
- data.tar.gz: 6f79d94140316047b0b0d9872f1b1b170b5a9a510482a2b3a921d64c50a2084b8e67faaafba5d2059d39f4316d6aca9b2b7dad86dfa41da38458759d0238d683
6
+ metadata.gz: daef124c711c4365df35f28c2366c8f0cab9a3e83110eb2574ccee83298fef06637e1ba183b31a65e4b6c03a79f412cc9308f2fd0769d74d01fa2d078d48e0d1
7
+ data.tar.gz: 16807bada66a3cbd525e2cdb7b5726e9b2457bb05b392dbabde129d42e6f808309c6b065a6fa1c4f72a222a55952bc551ec4a35ef51edef49bb33e29b8c37223
@@ -175,10 +175,42 @@ class Bcat
175
175
  end
176
176
  end
177
177
 
178
+ require 'optparse'
179
+
180
+ options = {}
181
+
182
+ OptionParser.new do |opts|
183
+
184
+ opts.banner = "Usage: #{$0} [OPTIONS]"
185
+
186
+ opts.on('-p', '--pre', 'Pre.') do |value|
187
+ options[:pre] = value
188
+ end
189
+
190
+
191
+ end.parse!
192
+
193
+ required_options = []
194
+ required_options.each do |option|
195
+ unless options[option]
196
+ $stderr.puts "Can not run #{option.to_s} was not given."
197
+ exit 1
198
+ end
199
+ end
200
+
178
201
  data = []
179
202
 
180
203
  STDIN.each_line do |line|
181
204
  data.push(line)
182
205
  end
183
206
 
207
+ if options[:pre]
208
+ puts '<pre>'
209
+ end
210
+
184
211
  puts Bcat::ANSI.new(data).to_html
212
+
213
+ if options[:pre]
214
+ puts '</pre>'
215
+ end
216
+
data/bin/ix-cat CHANGED
@@ -1,7 +1,7 @@
1
- #!/usr/bin/env bash
1
+ #!/usr/bin/env ruby
2
2
 
3
- application=$1
4
- target_path=`dirname $0`
5
- target_file="$target_path/ix-$application"
3
+ application = ARGV[0]
4
+ target_path = File.dirname(__FILE__)
5
+ target_file = "#{target_path}/ix-#{application}"
6
6
 
7
- cat $target_file
7
+ system "cat #{target_file}"
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ print ARGV[0]
4
+
5
+ STDIN.each_line do |line|
6
+ puts line.chomp
7
+ end
8
+
@@ -3,7 +3,12 @@
3
3
  normal = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
4
4
  rot13 = "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM"
5
5
 
6
- STDIN.each_line do |line|
7
- puts line.tr!(normal, rot13)
6
+ STDIN.each_char do |char|
7
+ candidate = char.tr!(normal, rot13)
8
+ if candidate
9
+ print candidate
10
+ else
11
+ print char
12
+ end
8
13
  end
9
14
 
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'isna'
4
+
5
+ UNIVERSE = (0..9).to_a
6
+ ROT = 5
7
+ DIGIT_REGEX = /^\d$/
8
+
9
+ def resolve(set, candidate)
10
+ needle = set.index(candidate)
11
+ if (needle + ROT) > set.size
12
+ return (needle - set.size + ROT)
13
+ end
14
+ if (needle + ROT) < set.size
15
+ return needle + ROT
16
+ end
17
+ if (needle == 5)
18
+ return 0
19
+ end
20
+ end
21
+
22
+ STDIN.each_char do |char|
23
+ next if char.chomp == ''
24
+ unless char =~ DIGIT_REGEX
25
+ print char
26
+ next
27
+ end
28
+ rotation = resolve(UNIVERSE, char.to_i)
29
+ m = (0..9).to_a.map do |n|
30
+ if n.to_s == char
31
+ char.to_ansi.green.to_s
32
+ else
33
+ n.to_s
34
+ end
35
+ end
36
+ # puts "#{rotation.to_s.to_ansi.red.to_s} = [" + (m * ', ') + "]"
37
+ print rotation
38
+ end
39
+
@@ -1,152 +1,222 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'optparse'
4
- require 'ostruct'
3
+ class Chunk
4
+ attr_accessor :char_1
5
+ attr_accessor :char_2
6
+ attr_accessor :index_1
7
+ attr_accessor :index_2
8
+
9
+ def initialize(c1, c2, i1, i2)
10
+ @char_1 = c1
11
+ @char_2 = c2
12
+ @index_1 = i1
13
+ @index_2 = i2
14
+ end
5
15
 
6
- configuration = OpenStruct.new
16
+ def to_s
17
+ "#{char_1} #{char_2} #{index_1} #{index_2}"
18
+ end
19
+ end
7
20
 
8
- OptionParser.new do |opts|
21
+ class Similarity
22
+ CHAR_REGEX = /./
9
23
 
10
- opts.banner = "Find similarity in a set of strings."
11
- opts.separator ''
12
- opts.separator "Usage: #{File.basename($0)} [OPTIONS]"
13
- opts.separator ''
24
+ attr_accessor :string_1
25
+ attr_accessor :string_2
14
26
 
15
- configuration.group = false
16
- configuration.threshold = 50
17
- configuration.summary = false
27
+ def initialize(string_1, string_2)
28
+ @string_1 = string_1
29
+ @string_2 = string_2
30
+ end
18
31
 
19
- description = "Group input in batches and process each individually (faster)"
20
- opts.on("-g", "--group", description) do |v|
21
- configuration.group = v
32
+ def tokens
33
+ chunks = []
34
+ string_1.scan(CHAR_REGEX).each_with_index do |char_1, index_1|
35
+ string_2.scan(CHAR_REGEX).each_with_index do |char_2, index_2|
36
+ next if char_1 != char_2
37
+ chunks.push(Chunk.new(char_1, char_2, index_1, index_2))
38
+ end
39
+ end
40
+ chunks
22
41
  end
23
42
 
24
- description = "Limit the number of results by threshold, default is 50"
25
- opts.on("-t", "--threshhold [NUMBER]", OptionParser::DecimalNumeric, description) do |v|
26
- configuration.threshold = v
43
+ def count
44
+ counter = 0
45
+ prev = false
46
+ tokens.each_with_index do |chunk, index|
47
+
48
+ unless prev
49
+ prev = chunk.index_1
50
+ next
51
+ end
52
+
53
+ if prev == (chunk.index_1 - 1)
54
+ counter += 1
55
+ end
56
+
57
+ prev = chunk.index_1
58
+ end
59
+
60
+ counter
27
61
  end
28
62
 
29
- description = "Print a Summary of the groups found"
30
- opts.on("-s", "--summary", description) do |v|
31
- configuration.summary = v
63
+ def score
64
+ desired = (string_1.size + string_2.size) / 2
65
+ size_thresh = ([string_1.size, string_2.size].sort.first.to_f / desired)
66
+ compatibility_thresh = (count.to_f + 1) / string_1.size
67
+ (size_thresh + compatibility_thresh).to_f / 2
32
68
  end
69
+ end
70
+
71
+ require 'optparse'
72
+
73
+ options = {}
74
+ options[:threshold] = 0.8
33
75
 
76
+ OptionParser.new do |opts|
34
77
 
35
- opts.separator ''
78
+ opts.banner = "Usage: #{$0} [OPTIONS]"
79
+
80
+ opts.on('-t', '--threshold [NUMBER]', 'Threshold default value is 0.8.') do |value|
81
+ options[:threshold] = value.to_f
82
+ end
83
+
84
+ opts.on('-s', '--summary', 'Print Summarized version.') do |value|
85
+ options[:summary] = value
86
+ end
36
87
 
37
88
  end.parse!
38
89
 
39
- # puts configuration.inspect
90
+ required_options = [:threshold]
91
+ required_options.each do |option|
92
+ unless options[option]
93
+ $stderr.puts "Can not run #{option.to_s} was not given."
94
+ exit 1
95
+ end
96
+ end
97
+
98
+ # hash = {
99
+ # 'line' => [
100
+ # { :line => 'line', :score => 1 },
101
+ # ]
102
+ # }
103
+
104
+ hash = {}
105
+ lines = 0
40
106
 
41
- class Array
42
- def product
43
- inject do |cumulative, value|
44
- cumulative += value
107
+ STDIN.each_line do |line|
108
+ line.chomp!
109
+ next if line == ''
110
+ lines += 1
111
+ resolved = false
112
+ hash.keys.each do |registered_line|
113
+ score = Similarity.new(line, registered_line).score
114
+ if score > options[:threshold]
115
+ hash[registered_line].push({
116
+ :line => line,
117
+ :score => score
118
+ })
119
+ resolved = true
45
120
  end
46
121
  end
122
+ next if resolved
123
+ hash[line] ||= []
47
124
  end
48
125
 
49
- class String
50
- def to_a
51
- array = []
52
- size.times do |n|
53
- array << self[n]
126
+ module Template
127
+
128
+ class Banner < Struct.new(:lines, :groups, :threshold, :datetime)
129
+ def to_s
130
+ format(template, to_h)
131
+ end
132
+ def template
133
+ '
134
+ Total Lines Parsed: %<lines>s
135
+ Total Groups Generated: %<groups>s
136
+ Similarity Theshold at: %<threshold>s
137
+ Generated on: %<datetime>s
138
+ '
54
139
  end
55
- array
56
140
  end
57
141
 
58
- def scores(other_string)
59
- longest_string = nil
60
- if other_string.size > self.size
61
- longest_string = other_string
62
- shortest_string = self
63
- else
64
- longest_string = self
65
- shortest_string = other_string
66
- end
67
- scores = longest_string.to_a.map do |char|
68
- 0
142
+ class Group < Struct.new(:number, :percent, :items, :line)
143
+ def to_s
144
+ format(template, to_h)
69
145
  end
70
- shortest_string.size.times do |index|
71
- if shortest_string[index] == longest_string[index]
72
- scores[index] = 1
73
- end
146
+ def template
147
+ 'Group %<number>s represents %<percent>s and has %<items>s items similar to: %<line>s'
74
148
  end
75
- scores
76
149
  end
77
150
 
78
- def similarity(other_string)
79
- scores(other_string).product * 100.0 / size
151
+ class Item < Struct.new(:count, :total, :score, :line)
152
+ def to_s
153
+ format(template, to_h)
154
+ end
155
+ def template
156
+ ' %<count>s/%<total>s %<score>s %<line>s'
157
+ end
80
158
  end
81
- end
82
159
 
83
- class TargetString
84
- attr_accessor :evaluated
85
- attr_accessor :data
86
- def to_s
87
- data
88
- end
89
160
  end
90
161
 
91
- # client
162
+ require 'isna'
92
163
 
93
- strings = []
164
+ summary_output = []
165
+ detailed_output = []
94
166
 
95
- STDIN.each_line do |line|
96
- next if line.chomp == ''
97
- strings << line.chomp
98
- end
167
+ banner = Template::Banner.new
168
+ banner.lines = lines.to_s.to_ansi.yellow.to_s
169
+ banner.groups = hash.keys.size.to_s.to_ansi.yellow.to_s
170
+ banner.threshold = options[:threshold].to_s.to_ansi.yellow.to_s
171
+ banner.datetime = Time.now.to_s.to_ansi.yellow.to_s
172
+ summary_output.push(banner.to_s)
99
173
 
100
- strings.sort! do |n1, n2|
101
- n1.size <=> n2.size
174
+ groups = []
175
+
176
+ hash.each do |category_name, records|
177
+ groups.push([category_name, records.size])
102
178
  end
103
-
104
- strings.reverse!
105
-
106
- strings.map! do |string|
107
- target_string = TargetString.new
108
- target_string.evaluated = false
109
- target_string.data = string
110
- target_string
179
+
180
+ sorted_groups_by_n_records_asc = groups.sort do |array_a, array_b|
181
+ number_of_records_in_a = array_a[1]
182
+ number_of_records_in_b = array_b[1]
183
+ number_of_records_in_a <=> number_of_records_in_b
111
184
  end
112
185
 
113
- if configuration.group
114
- groups = strings.group_by do |string|
115
- string.data.size
186
+ sorted_groups_by_n_records_asc.reverse.each_with_index do |key, index|
187
+ line, records = key[0], hash[key[0]]
188
+
189
+ detailed_output.push('')
190
+
191
+ group = Template::Group.new
192
+ group.percent = ('%2.2f%%' % ((records.size.to_f / lines) * 100)).to_s.to_ansi.red.to_s
193
+ group.number = (index + 1).to_s.to_ansi.red.to_s
194
+ group.items = records.size.to_s.to_ansi.cyan.to_s
195
+ group.line = line.chomp.to_ansi.green.to_s
196
+ summary_output.push(group.to_s)
197
+ detailed_output.push(group.to_s)
198
+
199
+ sorted_items_in_group = records.sort do |a, b|
200
+ a[:score] <=> b[:score]
116
201
  end
117
- else
118
- groups = { 0 => strings }
119
- end
120
202
 
121
- counter = 0
122
- groups.each do |key, group|
123
- group.each do |string_1|
124
- counter = 0
125
- unless string_1.evaluated
126
- if configuration.summary
127
- summary_string = string_1.to_s
128
- else
129
- puts "****>>" + string_1.to_s
130
- end
131
- end
132
- string_1.evaluated = true
133
- group.each do |string_2|
134
- next if string_2.evaluated
135
- similarity = string_1.to_s.similarity(string_2.to_s)
136
- scores = string_1.to_s.scores(string_2.to_s).inspect
137
- template = "%5.f %s"
138
- bindings = [similarity, string_2, scores]
139
- if similarity >= configuration.threshold
140
- string_2.evaluated = true
141
- counter += 1
142
- unless configuration.summary
143
- puts template % bindings
144
- end
145
- end
146
- end
147
- if counter > 0
148
- puts "#{counter} #{summary_string}"
149
- end
203
+ sorted_items_in_group.reverse.each_with_index do |record, index|
204
+ item = Template::Item.new
205
+ item.count = (index + 1).to_s.rjust(4, ' ').to_ansi.cyan.to_s
206
+ item.total = records.size.to_s.ljust(4, ' ').to_ansi.cyan.to_s
207
+ item.score = ('%4.2f%%' % (record[:score] * 100)).rjust(7, ' ').to_ansi.green.to_s
208
+ item.line = record[:line]
209
+ detailed_output.push(item.to_s)
150
210
  end
211
+
151
212
  end
152
213
 
214
+ summary_output.each do |output_line|
215
+ puts output_line
216
+ end
217
+
218
+ unless options[:summary]
219
+ detailed_output.each do |output_line|
220
+ puts output_line
221
+ end
222
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ix-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kazuyoshi Tlacaelel
@@ -199,6 +199,7 @@ executables:
199
199
  - ix-pick
200
200
  - ix-planning-tickets
201
201
  - ix-prefix
202
+ - ix-prepend
202
203
  - ix-pretty
203
204
  - ix-print-and-run
204
205
  - ix-psd-to-json
@@ -217,6 +218,7 @@ executables:
217
218
  - ix-reverse
218
219
  - ix-right
219
220
  - ix-rm
221
+ - ix-rot5
220
222
  - ix-rot13
221
223
  - ix-rot3
222
224
  - ix-rps
@@ -477,6 +479,7 @@ files:
477
479
  - bin/ix-pick
478
480
  - bin/ix-planning-tickets
479
481
  - bin/ix-prefix
482
+ - bin/ix-prepend
480
483
  - bin/ix-pretty
481
484
  - bin/ix-print-and-run
482
485
  - bin/ix-psd-to-json
@@ -497,6 +500,7 @@ files:
497
500
  - bin/ix-rm
498
501
  - bin/ix-rot13
499
502
  - bin/ix-rot3
503
+ - bin/ix-rot5
500
504
  - bin/ix-rps
501
505
  - bin/ix-ruby-constructor-arguments
502
506
  - bin/ix-ruby-methods