story_key 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,174 @@
1
+ # frozen_string_literal: true
2
+ require 'open-uri'
3
+ require 'rmagick'
4
+ require 'ruby/openai'
5
+
6
+ class StoryKey::ImageGenerator < StoryKey::Base
7
+ BG_COLOR = '#ffffff'
8
+ CAPTION_FONT_SIZE = 15
9
+ CAPTION_HEIGHT = 30
10
+ DALLE_SIZE = 512
11
+ FONT_PATH = File.expand_path('assets/BarlowSemiCondensed-Regular.ttf')
12
+ ERROR_IMAGE = File.expand_path('assets/error.png')
13
+ OUTPUT_PATH = File.expand_path('tmp/story-key.png')
14
+ FOOTER_FONT_SIZE = 17
15
+ FOOTER_HEIGHT = 30
16
+ HEADER_FONT_SIZE = 17
17
+ PANEL_SIZE = 350
18
+ PADDING = 10
19
+ STYLE = 'isometric art with white background'
20
+
21
+ option :seed
22
+ option :phrases
23
+
24
+ def call
25
+ return if openai_key.blank?
26
+ composite_image
27
+ end
28
+
29
+ private
30
+
31
+ def comp_width
32
+ num_cols = phrases.size > 1 ? 2 : 1
33
+ (PANEL_SIZE * num_cols) + (PADDING * (num_cols + 1))
34
+ end
35
+
36
+ def comp_height
37
+ num_rows = (phrases.size.to_f / 2).ceil
38
+ (PANEL_SIZE * num_rows) + (PADDING * (num_rows + 1)) + header_height + FOOTER_HEIGHT
39
+ end
40
+
41
+ def header_height
42
+ (multiline_seed.split("\n").size * HEADER_FONT_SIZE).ceil
43
+ end
44
+
45
+ def multiline_seed
46
+ seed.split
47
+ .each_slice(8)
48
+ .to_a
49
+ .map { |a| a.join(' ') }
50
+ .join("\n")
51
+ end
52
+
53
+ def composite_image
54
+ comp = image_background
55
+ comp = add_header(comp)
56
+ comp = add_panels(comp)
57
+ comp = add_footer(comp)
58
+ comp.write(OUTPUT_PATH)
59
+ delete_source_images
60
+ OUTPUT_PATH
61
+ end
62
+
63
+ def delete_source_images
64
+ image_paths.each { |path| FileUtils.rm_f(path) }
65
+ end
66
+
67
+ def add_panels(comp)
68
+ image_paths.each_slice(2).to_a.each_with_index do |row, row_idx|
69
+ row.each_with_index do |image_path, col_idx|
70
+ comp = add_panel(comp, image_path, row.size, row_idx, col_idx)
71
+ end
72
+ end
73
+ comp
74
+ end
75
+
76
+ def add_panel(comp, image_path, row_size, row_idx, col_idx)
77
+ y = header_height + (PANEL_SIZE * row_idx) + (PADDING * (row_idx + 2))
78
+ if row_size == 1 # Center the last image if it has no pair
79
+ gravity = Magick::NorthGravity
80
+ x = 0
81
+ else
82
+ gravity = Magick::NorthWestGravity
83
+ x = (PANEL_SIZE * col_idx) + (PADDING * (col_idx + 2))
84
+ end
85
+ img = Magick::ImageList.new(image_path)
86
+ comp.composite(img, gravity, x, y, Magick::OverCompositeOp)
87
+ end
88
+
89
+ def image_background
90
+ Magick::Image.new(comp_width, comp_height) do |m|
91
+ m.background_color = BG_COLOR
92
+ end
93
+ end
94
+
95
+ def image_paths
96
+ @image_paths ||= phrases.each_with_index.map do |phrase, idx|
97
+ response = dalle_client.images.generate(parameters: parameters(phrase))
98
+ error = response.dig('error', 'message')
99
+ image_url = response.dig('data', 0, 'url')
100
+ text = "#{idx + 1}. #{phrase}"
101
+ local_image_path(image_url, text, error.present?)
102
+ end
103
+ end
104
+
105
+ def local_image_path(image_url, phrase, error)
106
+ source_path, destination_path = panel_paths(error, image_url)
107
+ comp = Magick::ImageList.new(source_path)
108
+ comp.change_geometry!("#{PANEL_SIZE}x#{PANEL_SIZE}") do |cols, rows, img|
109
+ img.resize!(cols, rows)
110
+ end
111
+ caption_bg = Magick::Image.new(PANEL_SIZE, CAPTION_HEIGHT) { |m| m.background_color = BG_COLOR }
112
+ comp = comp.composite(caption_bg, Magick::SouthGravity, 0, 0, Magick::OverCompositeOp)
113
+ add_caption(comp, phrase)
114
+ comp.write(destination_path)
115
+ destination_path
116
+ end
117
+
118
+ def panel_paths(error, image_url)
119
+ if error
120
+ [ERROR_IMAGE, "#{SecureRandom.hex(10)}.png"]
121
+ else
122
+ local = local_image(image_url)
123
+ Array.new(2) { local }
124
+ end
125
+ end
126
+
127
+ def add_header(comp)
128
+ add_annotation(comp, multiline_seed, Magick::NorthGravity, 5)
129
+ end
130
+
131
+ def add_caption(comp, text)
132
+ offset = ((CAPTION_HEIGHT - CAPTION_FONT_SIZE).to_f / 2).ceil
133
+ add_annotation(comp, text, Magick::SouthGravity, offset)
134
+ end
135
+
136
+ def add_footer(comp)
137
+ text = "Made with StoryKey - #{StoryKey::GITHUB_URL}"
138
+ add_annotation(comp, text, Magick::SouthGravity, 10)
139
+ end
140
+
141
+ def add_annotation(comp, text, gravity, offset)
142
+ draw = Magick::Draw.new
143
+ comp.annotate(draw, 0, 0, 0, offset, text) do
144
+ draw.gravity = gravity
145
+ draw.pointsize = CAPTION_FONT_SIZE
146
+ draw.fill = '#000000'
147
+ draw.font = FONT_PATH
148
+ comp.format = 'png'
149
+ end
150
+ comp
151
+ end
152
+
153
+ def local_image(image_url)
154
+ filename = image_url.split('?').first.split('/').last
155
+ path = File.expand_path("tmp/#{filename}")
156
+ File.open(path, 'wb') do |file|
157
+ file << URI.parse(image_url).open.read
158
+ end
159
+ path
160
+ end
161
+
162
+ def parameters(phrase)
163
+ prompt = "#{phrase}, #{STYLE}"
164
+ { prompt:, size: "#{DALLE_SIZE}x#{DALLE_SIZE}" }
165
+ end
166
+
167
+ def openai_key
168
+ @openai_key ||= ENV.fetch('OPENAI_KEY', nil)
169
+ end
170
+
171
+ def dalle_client
172
+ @dalle_client ||= OpenAI::Client.new(access_token: openai_key)
173
+ end
174
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- class StoryKey::Generator < StoryKey::Base
2
+ class StoryKey::KeyGenerator < StoryKey::Base
3
3
  option :bitsize, default: -> {}
4
4
  option :format, default: -> {}
5
5
 
@@ -13,7 +13,11 @@ class StoryKey::Generator < StoryKey::Base
13
13
  private
14
14
 
15
15
  def formatted_str
16
- StoryKey::Coercer.call(str: random_bin, bitsize:, from: :bin, to: format)
16
+ StoryKey::Coercer.call(str:, bitsize:, from: :bin, to: format)
17
+ end
18
+
19
+ def str
20
+ "1#{random_bin}"[0, bitsize]
17
21
  end
18
22
 
19
23
  def random_bin
@@ -28,9 +28,9 @@ class StoryKey::Lexicon < StoryKey::Base
28
28
 
29
29
  def new_entry(part_of_speech, text, countable)
30
30
  StoryKey::Entry.new \
31
+ part_of_speech:,
31
32
  raw: text,
32
33
  text: text.gsub(/\[|\]/, ''),
33
- part_of_speech:,
34
34
  token: StoryKey::Tokenizer.call(text),
35
35
  countable:,
36
36
  preposition: text.match(/\[(.+)\]/).to_a[1]
@@ -11,7 +11,7 @@ class StoryKey::Tokenizer < StoryKey::Base
11
11
  def token_from_text
12
12
  text.downcase
13
13
  .gsub(/\[.+\]/, '')
14
- .gsub(/[^a-z0-9\s\-]/, '')
14
+ .gsub(/[^a-z0-9\s-]/, '')
15
15
  .strip
16
16
  .gsub(/\s+/, '-')
17
17
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module StoryKey
3
- VERSION = '0.3.0'
4
- VERSION_SLUG = 'Miami' # Name of a well-known place, no spaces
5
- LEXICON_SHA = '4eea29f'
3
+ VERSION = '0.4.0'
4
+ VERSION_SLUG = 'Miami' # Name of a well-known city, no spaces
5
+ LEXICON_SHA = '3bfbbf9'
6
6
  end
data/lib/story_key.rb CHANGED
@@ -6,6 +6,7 @@ require 'active_support/core_ext/string/inflections'
6
6
  require 'awesome_print'
7
7
  require 'base58'
8
8
  require 'digest'
9
+ require 'dotenv/load'
9
10
  require 'dry-initializer'
10
11
  require 'indefinite_article'
11
12
  require 'pry'
@@ -19,7 +20,7 @@ loader.setup
19
20
  module StoryKey
20
21
  BITS_PER_ENTRY = 10
21
22
  DEFAULT_BITSIZE = 256
22
- FOOTER_BITSIZE = 4 # StoryKey::BITS_PER_ENTRY <= 2^StoryKey::FOOTER_BITSIZE
23
+ FOOTER_BITSIZE = 4 # StoryKey::BITS_PER_ENTRY must be lte 2^StoryKey::FOOTER_BITSIZE
23
24
  FORMATS = %i[base58 hex bin dec].freeze
24
25
  GRAMMAR = {
25
26
  4 => %i[adjective noun verb noun],
@@ -30,10 +31,10 @@ module StoryKey
30
31
  LEXICON_SHA_SIZE = 7
31
32
  MAX_BITSIZE = 512
32
33
  PREPOSITIONS = %w[in i saw and a an].freeze
34
+ GITHUB_URL = 'https://github.com/jcraigk/storykey'
33
35
 
34
- Entry = Struct.new \
35
- :raw, :token, :text, :countable, :preposition, :part_of_speech, keyword_init: true
36
- Story = Struct.new(:text, :humanized, :tokenized, keyword_init: true)
36
+ Entry = Struct.new(:part_of_speech, :raw, :token, :text, :countable, :preposition)
37
+ Story = Struct.new(:phrases, :text, :humanized, :tokenized)
37
38
 
38
39
  class Error < StandardError; end
39
40
  class InvalidFormat < Error; end
data/rakelib/lexicon.rake CHANGED
@@ -1,6 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
  require_relative '../lib/story_key'
3
3
 
4
+ def noun_entries
5
+ { countable: [], uncountable: [] }.tap do |data|
6
+ Dir.glob('lexicons/nouns/**/*.txt') do |path|
7
+ group = path.split('/')[-2] == 'countable' ? :countable : :uncountable
8
+ data[group] += txtfile_lines(path)
9
+ end
10
+ data.each { |group, entries| data[group] = entries.sort }
11
+ end
12
+ end
13
+
14
+ def verb_entries
15
+ { entries: txtfile_lines('lexicons/verbs/entries.txt') }
16
+ end
17
+
18
+ def adjective_entries
19
+ entries = []
20
+ Dir.glob('lexicons/adjectives/*.txt') do |path|
21
+ entries += txtfile_lines(path)
22
+ end
23
+ { entries: entries.sort }
24
+ end
25
+
26
+ def txtfile_lines(path)
27
+ File.readlines(path)
28
+ .map(&:strip)
29
+ .reject { |l| l.start_with?('#') || l.blank? }
30
+ end
31
+
4
32
  namespace :lexicon do
5
33
  desc 'Build lib/story_key/data.rb from text files'
6
34
  task :build do
@@ -17,15 +45,15 @@ namespace :lexicon do
17
45
  TEXT
18
46
  str += [].tap do |ary|
19
47
  StoryKey::GRAMMAR.values.flatten.uniq.each do |part_of_speech|
20
- substr = " #{part_of_speech}: {\n"
48
+ substr = " #{part_of_speech}: {\n"
21
49
  substr +=
22
50
  [].tap do |ary2|
23
- entries_for(part_of_speech).each do |group, entries|
51
+ send("#{part_of_speech}_entries").each do |group, entries|
24
52
  elements = entries.map { |e| "'#{e}'" }.join(', ')
25
- ary2 << " #{group}: [#{elements}]"
53
+ ary2 << " #{group}: [#{elements}]"
26
54
  end
27
55
  end.join(",\n")
28
- ary << "#{substr}\n }"
56
+ ary << "#{substr}\n }"
29
57
  end
30
58
  end.join(",\n")
31
59
  str +=
@@ -37,20 +65,4 @@ namespace :lexicon do
37
65
  File.write(output_file, str)
38
66
  puts "#{output_file} written"
39
67
  end
40
-
41
- def entries_for(part_of_speech)
42
- { countable: [], uncountable: [] }.tap do |data|
43
- Dir.glob("lexicons/#{part_of_speech}s/**/*.txt") do |path|
44
- group = path.split('/')[-2] == 'countable' ? :countable : :uncountable
45
- data[group] += txtfile_lines(path)
46
- end
47
- data.each { |group, entries| data[group] = entries.sort }
48
- end
49
- end
50
-
51
- def txtfile_lines(path)
52
- File.readlines(path)
53
- .map(&:strip)
54
- .reject { |l| l.start_with?('#') || l.blank? }
55
- end
56
68
  end
data/story_key.gemspec CHANGED
@@ -7,9 +7,9 @@ Gem::Specification.new do |spec|
7
7
  spec.authors = ['Justin Craig-Kuhn (JCK)']
8
8
  spec.email = ['jcraigk@gmail.com']
9
9
  spec.summary = 'StoryKey turns your crypto private key into a memorable story'
10
- spec.homepage = 'https://github.com/jcraigk/story_key'
10
+ spec.homepage = 'https://github.com/jcraigk/storykey'
11
11
  spec.license = 'MIT'
12
- spec.required_ruby_version = '>= 3.1.0'
12
+ spec.required_ruby_version = '>= 3.2.0'
13
13
  spec.bindir = 'bin'
14
14
  spec.executables = spec.files.grep(%r{\Abin/}) { |f| File.basename(f) }
15
15
  spec.require_paths = ['lib']
@@ -17,21 +17,24 @@ Gem::Specification.new do |spec|
17
17
  f.match(%r{^(spec)/})
18
18
  end
19
19
 
20
- spec.add_dependency 'activesupport', '~> 7.0.2'
20
+ spec.add_dependency 'activesupport', '~> 7.0.4'
21
21
  spec.add_dependency 'awesome_print', '~> 1.9.2'
22
22
  spec.add_dependency 'base58', '~> 0.2.3'
23
+ spec.add_dependency 'dotenv', '~> 2.8.1'
23
24
  spec.add_dependency 'dry-initializer', '~> 3.1.1'
24
- spec.add_dependency 'indefinite_article', '~> 0.2.4'
25
+ spec.add_dependency 'indefinite_article', '~> 0.2.5'
25
26
  spec.add_dependency 'pry', '~> 0.14.1'
26
27
  spec.add_dependency 'remedy', '~> 0.3.0'
28
+ spec.add_dependency 'rmagick', '~> 5.1.0'
29
+ spec.add_dependency 'ruby-openai', '~> 3.0.2'
27
30
  spec.add_dependency 'thor', '~> 1.2.1'
28
- spec.add_dependency 'zeitwerk', '~> 2.5.4'
31
+ spec.add_dependency 'zeitwerk', '~> 2.6.6'
29
32
 
30
- spec.add_development_dependency 'bundler', '~> 2.3.7'
33
+ spec.add_development_dependency 'bundler', '~> 2.4.1'
31
34
  spec.add_development_dependency 'rake', '~> 13.0.6'
32
- spec.add_development_dependency 'rspec', '~> 3.11.0'
33
- spec.add_development_dependency 'rubocop', '~> 1.26.1'
34
- spec.add_development_dependency 'rubocop-performance', '~> 1.13.3'
35
+ spec.add_development_dependency 'rspec', '~> 3.12.0'
36
+ spec.add_development_dependency 'rubocop', '~> 1.41.1'
37
+ spec.add_development_dependency 'rubocop-performance', '~> 1.15.2'
35
38
  spec.add_development_dependency 'rubocop-rake', '~> 0.6.0'
36
- spec.add_development_dependency 'rubocop-rspec', '~> 2.9.0'
39
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.16.0'
37
40
  end
data/tmp/.keep ADDED
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: story_key
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Craig-Kuhn (JCK)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-04 00:00:00.000000000 Z
11
+ date: 2023-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 7.0.2
19
+ version: 7.0.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 7.0.2
26
+ version: 7.0.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: awesome_print
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.2.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: dotenv
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.8.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.8.1
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: dry-initializer
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +86,14 @@ dependencies:
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: 0.2.4
89
+ version: 0.2.5
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: 0.2.4
96
+ version: 0.2.5
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: pry
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,34 @@ dependencies:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: 0.3.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: rmagick
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 5.1.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 5.1.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: ruby-openai
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 3.0.2
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 3.0.2
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: thor
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -128,28 +170,28 @@ dependencies:
128
170
  requirements:
129
171
  - - "~>"
130
172
  - !ruby/object:Gem::Version
131
- version: 2.5.4
173
+ version: 2.6.6
132
174
  type: :runtime
133
175
  prerelease: false
134
176
  version_requirements: !ruby/object:Gem::Requirement
135
177
  requirements:
136
178
  - - "~>"
137
179
  - !ruby/object:Gem::Version
138
- version: 2.5.4
180
+ version: 2.6.6
139
181
  - !ruby/object:Gem::Dependency
140
182
  name: bundler
141
183
  requirement: !ruby/object:Gem::Requirement
142
184
  requirements:
143
185
  - - "~>"
144
186
  - !ruby/object:Gem::Version
145
- version: 2.3.7
187
+ version: 2.4.1
146
188
  type: :development
147
189
  prerelease: false
148
190
  version_requirements: !ruby/object:Gem::Requirement
149
191
  requirements:
150
192
  - - "~>"
151
193
  - !ruby/object:Gem::Version
152
- version: 2.3.7
194
+ version: 2.4.1
153
195
  - !ruby/object:Gem::Dependency
154
196
  name: rake
155
197
  requirement: !ruby/object:Gem::Requirement
@@ -170,42 +212,42 @@ dependencies:
170
212
  requirements:
171
213
  - - "~>"
172
214
  - !ruby/object:Gem::Version
173
- version: 3.11.0
215
+ version: 3.12.0
174
216
  type: :development
175
217
  prerelease: false
176
218
  version_requirements: !ruby/object:Gem::Requirement
177
219
  requirements:
178
220
  - - "~>"
179
221
  - !ruby/object:Gem::Version
180
- version: 3.11.0
222
+ version: 3.12.0
181
223
  - !ruby/object:Gem::Dependency
182
224
  name: rubocop
183
225
  requirement: !ruby/object:Gem::Requirement
184
226
  requirements:
185
227
  - - "~>"
186
228
  - !ruby/object:Gem::Version
187
- version: 1.26.1
229
+ version: 1.41.1
188
230
  type: :development
189
231
  prerelease: false
190
232
  version_requirements: !ruby/object:Gem::Requirement
191
233
  requirements:
192
234
  - - "~>"
193
235
  - !ruby/object:Gem::Version
194
- version: 1.26.1
236
+ version: 1.41.1
195
237
  - !ruby/object:Gem::Dependency
196
238
  name: rubocop-performance
197
239
  requirement: !ruby/object:Gem::Requirement
198
240
  requirements:
199
241
  - - "~>"
200
242
  - !ruby/object:Gem::Version
201
- version: 1.13.3
243
+ version: 1.15.2
202
244
  type: :development
203
245
  prerelease: false
204
246
  version_requirements: !ruby/object:Gem::Requirement
205
247
  requirements:
206
248
  - - "~>"
207
249
  - !ruby/object:Gem::Version
208
- version: 1.13.3
250
+ version: 1.15.2
209
251
  - !ruby/object:Gem::Dependency
210
252
  name: rubocop-rake
211
253
  requirement: !ruby/object:Gem::Requirement
@@ -226,14 +268,14 @@ dependencies:
226
268
  requirements:
227
269
  - - "~>"
228
270
  - !ruby/object:Gem::Version
229
- version: 2.9.0
271
+ version: 2.16.0
230
272
  type: :development
231
273
  prerelease: false
232
274
  version_requirements: !ruby/object:Gem::Requirement
233
275
  requirements:
234
276
  - - "~>"
235
277
  - !ruby/object:Gem::Version
236
- version: 2.9.0
278
+ version: 2.16.0
237
279
  description:
238
280
  email:
239
281
  - jcraigk@gmail.com
@@ -241,7 +283,6 @@ executables: []
241
283
  extensions: []
242
284
  extra_rdoc_files: []
243
285
  files:
244
- - ".DS_Store"
245
286
  - ".gitignore"
246
287
  - ".rspec"
247
288
  - ".rubocop.yml"
@@ -252,6 +293,8 @@ files:
252
293
  - LICENSE.txt
253
294
  - README.md
254
295
  - Rakefile
296
+ - assets/BarlowSemiCondensed-Regular.ttf
297
+ - assets/error.png
255
298
  - bin/console
256
299
  - bin/setup
257
300
  - bin/storykey
@@ -269,7 +312,7 @@ files:
269
312
  - lexicons/nouns/uncountable/misc_characters.txt
270
313
  - lexicons/nouns/uncountable/simpsons_characters.txt
271
314
  - lexicons/nouns/uncountable/starwars_characters.txt
272
- - lexicons/verbs/misc.txt
315
+ - lexicons/verbs/entries.txt
273
316
  - lib/story_key.rb
274
317
  - lib/story_key/base.rb
275
318
  - lib/story_key/class_methods.rb
@@ -279,13 +322,15 @@ files:
279
322
  - lib/story_key/data.rb
280
323
  - lib/story_key/decoder.rb
281
324
  - lib/story_key/encoder.rb
282
- - lib/story_key/generator.rb
325
+ - lib/story_key/image_generator.rb
326
+ - lib/story_key/key_generator.rb
283
327
  - lib/story_key/lexicon.rb
284
328
  - lib/story_key/tokenizer.rb
285
329
  - lib/story_key/version.rb
286
330
  - rakelib/lexicon.rake
287
331
  - story_key.gemspec
288
- homepage: https://github.com/jcraigk/story_key
332
+ - tmp/.keep
333
+ homepage: https://github.com/jcraigk/storykey
289
334
  licenses:
290
335
  - MIT
291
336
  metadata: {}
@@ -297,14 +342,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
297
342
  requirements:
298
343
  - - ">="
299
344
  - !ruby/object:Gem::Version
300
- version: 3.1.0
345
+ version: 3.2.0
301
346
  required_rubygems_version: !ruby/object:Gem::Requirement
302
347
  requirements:
303
348
  - - ">="
304
349
  - !ruby/object:Gem::Version
305
350
  version: '0'
306
351
  requirements: []
307
- rubygems_version: 3.3.7
352
+ rubygems_version: 3.4.1
308
353
  signing_key:
309
354
  specification_version: 4
310
355
  summary: StoryKey turns your crypto private key into a memorable story
data/.DS_Store DELETED
Binary file