aromancer 0.0.5 → 0.0.7

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.
@@ -14,8 +14,6 @@ module Aromancer
14
14
  class Server
15
15
  include Singleton
16
16
 
17
- DEVELOP_SERVER_URL = "http://localhost:3000"
18
-
19
17
  HEADERS = { "Content-Type": "application/json" }
20
18
 
21
19
  class InternalError
@@ -35,10 +33,8 @@ module Aromancer
35
33
  end
36
34
  end
37
35
 
38
- def self.api_key_param
39
- {
40
- api_key: Aromancer::Storage.get_player["api_key"]
41
- }
36
+ def self.auth_header
37
+ {"Authorization": "Bearer #{Aromancer::Storage.get_player["api_key"]}"}
42
38
  end
43
39
 
44
40
  def self.sign_in(email_address, password)
@@ -78,8 +74,7 @@ module Aromancer
78
74
  begin
79
75
  Faraday.new(
80
76
  url: Aromancer::Storage.get_server_url,
81
- headers: HEADERS,
82
- params: api_key_param
77
+ headers: HEADERS.merge(auth_header),
83
78
  ).delete("/session")
84
79
  rescue StandardError => e
85
80
  InternalError.build(e)
@@ -90,8 +85,8 @@ module Aromancer
90
85
  begin
91
86
  Faraday.new(
92
87
  url: Aromancer::Storage.get_server_url,
93
- headers: HEADERS,
94
- params: params.merge(api_key_param)
88
+ headers: HEADERS.merge(auth_header),
89
+ params: params
95
90
  ).post("/legends")
96
91
  rescue StandardError => e
97
92
  InternalError.build(e)
@@ -102,20 +97,30 @@ module Aromancer
102
97
  begin
103
98
  Faraday.new(
104
99
  url: Aromancer::Storage.get_server_url,
105
- headers: HEADERS,
106
- params: api_key_param
100
+ headers: HEADERS.merge(auth_header),
107
101
  ).get("/legends")
108
102
  rescue StandardError => e
109
103
  InternalError.build(e)
110
104
  end
111
105
  end
112
106
 
107
+ def self.find_legends
108
+ begin
109
+ Faraday.new(
110
+ url: Aromancer::Storage.get_server_url,
111
+ headers: HEADERS.merge(auth_header),
112
+ ).get("/legends/find")
113
+ rescue StandardError => e
114
+ InternalError.build(e)
115
+ end
116
+ end
117
+
113
118
  def self.update_player(params)
114
119
  begin
115
120
  Faraday.new(
116
121
  url: Aromancer::Storage.get_server_url,
117
- headers: HEADERS,
118
- params: params.merge(api_key_param)
122
+ headers: HEADERS.merge(auth_header),
123
+ params: params
119
124
  ).put("/players/#{Aromancer::Storage.get_player["id"]}")
120
125
  rescue StandardError => e
121
126
  InternalError.build(e)
@@ -123,67 +128,68 @@ module Aromancer
123
128
  end
124
129
 
125
130
  def self.get_arena
126
- legend_id = Aromancer::Storage.get_player["active_legend_id"]
131
+ legend_id = (Aromancer::Storage.get_player || {})["active_legend_id"]
132
+ return InternalError.build(StandardError.new("no active legend")) if legend_id.nil?
127
133
 
128
134
  begin
129
135
  Faraday.new(
130
136
  url: Aromancer::Storage.get_server_url,
131
- headers: HEADERS,
132
- params: api_key_param
137
+ headers: HEADERS.merge(auth_header),
133
138
  ).get("/legends/#{legend_id}/arena")
134
139
  rescue StandardError => e
135
140
  InternalError.build(e)
136
141
  end
137
142
  end
138
143
 
139
- def self.get_stream
140
- legend_id = Aromancer::Storage.get_player["active_legend_id"]
144
+ def self.get_stream(count = nil)
145
+ legend_id = (Aromancer::Storage.get_player || {})["active_legend_id"]
146
+ return InternalError.build(StandardError.new("no active legend")) if legend_id.nil?
141
147
 
142
148
  begin
143
149
  Faraday.new(
144
150
  url: Aromancer::Storage.get_server_url,
145
- headers: HEADERS,
146
- params: api_key_param
147
- ).get("/legends/#{legend_id}/stream")
151
+ headers: HEADERS.merge(auth_header),
152
+ ).get("/legends/#{legend_id}/stream?count=#{count || nil}")
148
153
  rescue StandardError => e
149
154
  InternalError.build(e)
150
155
  end
151
156
  end
152
157
 
153
158
  def self.get_word_possibilities(selected_word_id)
154
- legend_id = Aromancer::Storage.get_player["active_legend_id"]
159
+ legend_id = (Aromancer::Storage.get_player || {})["active_legend_id"]
160
+ return InternalError.build(StandardError.new("no active legend")) if legend_id.nil?
161
+
155
162
  begin
156
163
  Faraday.new(
157
164
  url: Aromancer::Storage.get_server_url,
158
- headers: HEADERS,
159
- params: api_key_param
165
+ headers: HEADERS.merge(auth_header),
160
166
  ).get("/legends/#{legend_id}/words/#{selected_word_id}/possibilities")
161
167
  rescue StandardError => e
162
168
  InternalError.build(e)
163
169
  end
164
170
  end
165
171
 
166
- def self.create_turn(params)
167
- legend_id = Aromancer::Storage.get_player["active_legend_id"]
172
+ def self.submit_turn(request_uuid, params = {})
173
+ legend_id = (Aromancer::Storage.get_player || {})["active_legend_id"]
174
+ return InternalError.build(StandardError.new("no active legend")) if legend_id.nil?
175
+
168
176
  begin
169
177
  Faraday.new(
170
178
  url: Aromancer::Storage.get_server_url,
171
- headers: HEADERS,
172
- params: params.merge(api_key_param)
173
- ).post("/legends/#{legend_id}/arena")
179
+ headers: HEADERS.merge(auth_header),
180
+ params: params
181
+ ).put("/legends/#{legend_id}/arena/#{request_uuid}")
174
182
  rescue StandardError => e
175
183
  InternalError.build(e)
176
184
  end
177
185
  end
178
186
 
179
- def self.update_turn(params)
180
- legend_id = Aromancer::Storage.get_player["active_legend_id"]
187
+ def self.load_rules
181
188
  begin
182
189
  Faraday.new(
183
190
  url: Aromancer::Storage.get_server_url,
184
- headers: HEADERS,
185
- params: params.merge(api_key_param)
186
- ).put("/legends/#{legend_id}/arena")
191
+ headers: HEADERS.merge(auth_header),
192
+ ).get("/")
187
193
  rescue StandardError => e
188
194
  InternalError.build(e)
189
195
  end
@@ -12,6 +12,8 @@ module Aromancer
12
12
  class Storage
13
13
  include Singleton
14
14
 
15
+ DEFAULT_SERVER = "http://127.0.0.1"
16
+
15
17
  attr_accessor :storage_open, :cache
16
18
 
17
19
  def initialize
@@ -46,7 +48,7 @@ module Aromancer
46
48
  return Time.now.to_i
47
49
  end
48
50
 
49
- def self.get_preference(preference, default: :default)
51
+ def self.get_preference(preference, default: nil)
50
52
  p_key = "preference_#{preference}"
51
53
  p = instance.get_key(p_key)
52
54
  if p.nil?
@@ -61,8 +63,13 @@ module Aromancer
61
63
  instance.set_key(p_key, value)
62
64
  end
63
65
 
66
+ def self.toggle_preference(key)
67
+ v = get_preference(key)
68
+ set_preference(key, !v)
69
+ end
70
+
64
71
  def self.toggle_force_ssl
65
- set_preference(:force_ssl, !get_preference(:force_ssl))
72
+ toggle_preference(:force_ssl)
66
73
  v = get_preference(:force_ssl)
67
74
  self.instance.set_key(:server_url_scheme, "http#{v ? :s : ""}")
68
75
  self.instance.set_key(:websocket_scheme, "ws#{v ? :s : ""}")
@@ -124,17 +131,18 @@ module Aromancer
124
131
 
125
132
  def self.set_server_url(server_url)
126
133
  uri = URI.parse(server_url)
127
- if uri.kind_of?(URI::HTTP) or uri.kind_of?(URI::HTTPS)
134
+ if uri.kind_of?(URI::HTTP) || uri.kind_of?(URI::HTTPS)
128
135
  URI_KEYS.each{|k|
136
+ uri.kind_of?(URI::HTTP) && get_preference(:force_ssl) ? toggle_force_ssl : nil
129
137
  Aromancer::Storage.instance.set_key("server_url_#{k}", uri.select(k).first)
130
138
  }
131
- else
132
- set_server_url(Aromancer::Server::DEVELOP_SERVER_URL)
139
+ elsif get_server_url.nil?
140
+ set_server_url(DEFAULT_SERVER)
133
141
  end
134
142
  end
135
143
 
136
144
  def self.get_server_url
137
- set_server_url(Aromancer::Server::DEVELOP_SERVER_URL) if URI_KEYS.all?{|k| Aromancer::Storage.instance.get_key("server_url_#{k}").nil?}
145
+ set_server_url(DEFAULT_SERVER) if URI_KEYS.all?{|k| Aromancer::Storage.instance.get_key("server_url_#{k}").nil?}
138
146
  URI.parse(URI_KEYS.map{|k|
139
147
  c = Aromancer::Storage.instance.get_key("server_url_#{k}")
140
148
  case k
@@ -187,16 +195,15 @@ module Aromancer
187
195
  FileUtils.rm(Aromancer::Storage.storage_filepath)
188
196
  return
189
197
  end
190
- @storage_open = false
191
198
 
192
199
  # only update the cache value if present in storage
193
200
  if storage_contents.keys.include?(key)
194
- @cache[key][:value] = storage_contents[key]
195
- @cache[key][:persisted] = true
201
+ @cache[key] = {value: storage_contents[key], persisted: true}
196
202
  else
197
203
  @cache[key][:persisted] = false
198
204
  end
199
205
 
206
+ @storage_open = false
200
207
  @cache[key][:value]
201
208
  end
202
209
 
@@ -11,5 +11,5 @@
11
11
  =end
12
12
 
13
13
  module Aromancer
14
- VERSION = "0.0.5"
14
+ VERSION = "0.0.7"
15
15
  end
@@ -16,14 +16,22 @@ module Aromancer
16
16
 
17
17
  TYPES = [
18
18
  :arena,
19
- :player
19
+ :legends,
20
+ :player # todo: not used
20
21
  ]
21
22
 
22
23
  attr_accessor :socket
23
24
 
24
- def connect(api_key)
25
+ def connect
25
26
  return unless self.socket.nil?
26
- self.socket = WebSocket::Client::Simple.connect("#{Aromancer::Storage.get_websocket_url}?api_key=#{api_key}")
27
+ return if Aromancer::Storage.get_player["api_key"].nil?
28
+
29
+ begin
30
+ self.socket = WebSocket::Client::Simple.connect(Aromancer::Storage.get_websocket_url, {headers: Aromancer::Server.auth_header})
31
+ rescue Socket::ResolutionError => e
32
+ disconnect
33
+ return
34
+ end
27
35
  self.socket.on :message do |msg|
28
36
  payload = JSON.parse(msg.data) rescue msg.data
29
37
  if !payload.nil? &&
@@ -32,10 +40,18 @@ module Aromancer
32
40
  !payload["message"]["type"].nil? &&
33
41
  TYPES.include?(payload["message"]["type"].to_sym)
34
42
 
35
- legend_id = payload["message"]["id"]
36
- lid = Aromancer::Storage.get_player&.symbolize_keys[:active_legend_id]
37
- if !lid.nil? && lid == legend_id.to_i
38
- Aromancer::Cli.instance.start_ui_thread
43
+ case payload["message"]["type"].to_sym
44
+ when :arena
45
+ legend_id = payload["message"]["id"]
46
+ lid = Aromancer::Storage.get_player&.symbolize_keys[:active_legend_id]
47
+ if !lid.nil? && lid == legend_id.to_i
48
+ Aromancer::Api.load_arena
49
+ sleep(0.5)
50
+ Aromancer::Cli.instance.start_ui_thread
51
+ end
52
+ when :legends
53
+ Aromancer::Api.get_legends
54
+ when :player
39
55
  end
40
56
  end
41
57
  end
@@ -43,7 +59,7 @@ module Aromancer
43
59
  self.socket.on :open do
44
60
  r = {
45
61
  command: "subscribe",
46
- identifier: {channel: "PlayerChannel", api_key: api_key}.to_json
62
+ identifier: {channel: "PlayerChannel"}.to_json
47
63
  }.to_json
48
64
  Aromancer::Websocket.instance.socket.send(r)
49
65
  end
@@ -59,7 +75,8 @@ module Aromancer
59
75
  end
60
76
 
61
77
  def disconnect
62
- self.socket = nil unless self.socket.nil?
78
+ self.socket&.close
79
+ self.socket = nil
63
80
  end
64
81
  end
65
82
  end
data/lib/aromancer.rb CHANGED
@@ -14,19 +14,51 @@ require_relative :reiquire.to_s
14
14
  Reiquire::aromancer
15
15
 
16
16
  module Aromancer
17
- THROTTLE_MS = 0.4
17
+ THROTTLE_MS = 0.1
18
+ ERROR_EXPIRATION = 7.77.to_f
18
19
  FONT = TTY::Font.new(:standard)
20
+ DATE_FORMAT = "%A %d %b %Y %I:%M:%S %p"
21
+ TIME_FORMAT = "%I:%M:%S %p"
22
+
23
+ UNICODE = {
24
+ close: "\u2A2F",
25
+ check: "\u2713"
26
+ }
27
+
28
+ class Serve
29
+ def self.run
30
+ unless Dir.exist?("#{Aromancer.to_s.downcase}_serve")
31
+ system("git clone git@github.com:arowmancy/aromancer_serve.git")
32
+ end
33
+ FileUtils.chdir :aromancer_serve.to_s do
34
+ system("bin/setup")
35
+ end
36
+ end
37
+ end
19
38
 
20
39
  # instance runs on main thread
21
40
  class Cli
22
41
  include Singleton
23
42
 
24
- attr_accessor :ui_thread, :ws_thread, :busy, :last_render
43
+ attr_accessor :ui_thread, :ws_thread, :busy, :ws_busy, :last_render, :error_timeout
25
44
 
26
45
  # user entry point
27
46
  def self.run
47
+ # ensure preferences exist
48
+ Aromancer::Storage.get_preference(:debug, default: false)
49
+ Aromancer::Storage.get_preference(:force_ssl, default: true)
50
+ Aromancer::Storage.get_preference(:hide_sentences, default: true)
51
+ Aromancer::Storage.get_preference(:hide_stream, default: true)
52
+
53
+ self.instance.last_render = 0
54
+ self.instance.error_timeout = Time.now.to_i
55
+
56
+ # load player on-start
57
+ Aromancer::Api.set_active_legend_id(nil) unless Aromancer::Storage.get_player.nil?
58
+
28
59
  Thread.main[:route] = :authentication
29
- self.instance.last_render = Time.now
60
+ Thread.main[:menu_runners] = {}
61
+ Thread.main[:menu_options] = {}
30
62
  Aromancer::Prompt.say(I18n.t("shared.welcome", version: Aromancer::VERSION))
31
63
  Aromancer::Prompt.say(I18n.t("shared.server_url", url: Aromancer::Storage::get_server_url))
32
64
  self.instance.start_ui_thread
@@ -35,70 +67,79 @@ module Aromancer
35
67
  begin
36
68
  self.instance.ui_thread.join
37
69
  rescue NoMethodError => e
70
+ if Aromancer::Storage.get_preference(:debug)
71
+ Aromancer::Prompt.say(I18n.t("shared.last_error"))
72
+ Aromancer::Prompt.say(JSON.pretty_generate(e[:body.to_s]))
73
+ Aromancer::Prompt.say("sleeping 5 on main thread...")
74
+ sleep(5)
75
+ end
38
76
  self.instance.start_ui_thread
77
+ self.instance.start_ws_thread
39
78
  sleep(1)
40
79
  rescue Interrupt => e
80
+ Aromancer::Prompt.say("interrupt on main thread...exiting immediately.")
41
81
  exit
42
82
  end
43
83
  end
44
84
  end
45
85
 
46
- def start_ui_thread
47
- if @busy || Time.now - @last_render < 2
48
- # Thread.new{
49
- # while Aromancer::Cli.instance.busy do
50
- # if Time.now - Aromancer::Cli.instance.last_render > 5
51
- # sleep(2)
52
- # Aromancer::Cli.instance.start_ui_thread
53
- # end
54
- # end
55
- # }.join
56
- return
57
- end
86
+ def get_view(view_key)
87
+ Thread.main[:menu_options][view_key.to_sym]
88
+ end
89
+
90
+ def start_ui_thread(force = false)
91
+ return if (@busy || Time.now - @last_render < 2.0) && !force
92
+
58
93
  @busy = true
59
94
  self.ui_thread&.exit
60
95
  self.ui_thread&.kill
61
- Thread.main[:input_controls] = nil
96
+ Thread.main[:menu_runners] = {}
97
+ Thread.main[:menu_options] = {}
62
98
  Aromancer::Prompt.instance.reload!
63
99
  self.ui_thread = Thread.new do
64
100
  loop do
65
- ic = Thread.main[:input_controls]
66
- unless ic.nil?
101
+ menu_options = Thread.main[:menu_options][Thread.main[:route]]
102
+ menu_runners = Thread.main[:menu_runners][Thread.main[:route]]
103
+ unless menu_options.nil? || menu_runners.nil?
67
104
  Aromancer::Routes.resume
105
+ Aromancer.print_hud
68
106
  sleep(THROTTLE_MS)
69
- v = Aromancer::Prompt.p.select("", ic[:choices], show_help: :always, cycle: true, per_page: 11)
70
- runners = ic[:runners].select{|r| r[:value] == v}
71
- runners = ic[:runners].select{|r| r[:value].nil?} if runners.empty?
107
+ v = Aromancer::Prompt.p.select("", menu_options, show_help: :always, cycle: true, per_page: 11)
108
+ runners = menu_runners.select{|r| r[:value] == v}
109
+ runners = menu_runners.select{|r| r[:value].nil?} if runners.empty?
72
110
 
73
111
  if runners.any?
74
112
  r = runners.first
75
113
  r[:proc].call(v)
76
- else
77
- exit
78
114
  end
115
+
79
116
  else
80
117
  Aromancer::Routes.resume
81
118
  end
82
119
  Aromancer::Cli.instance.busy = false
83
120
  Aromancer::Cli.instance.last_render = Time.now
84
- # sleep(THROTTLE_MS)
121
+ sleep(THROTTLE_MS)
85
122
  end
86
123
  end
87
124
  end
88
125
 
89
126
  def start_ws_thread
127
+ return if @ws_busy
128
+ @ws_busy = true
90
129
  self.ws_thread.kill unless self.ws_thread.nil?
91
130
  self.ws_thread = Thread.new do
131
+ Aromancer::Websocket.instance.disconnect
92
132
  loop do
93
133
  player = Aromancer::Storage.get_player
94
134
  if player.nil?
135
+ @ws_busy = true
95
136
  Aromancer::Websocket.instance.disconnect
96
137
  elsif !player["api_key"].nil?
97
138
  # attempt websocket connection
98
- # puts :ws_thread
99
- Aromancer::Websocket.instance.connect(player["api_key"])
139
+ @ws_busy = true
140
+ Aromancer::Websocket.instance.connect
100
141
  end
101
-
142
+ @ws_busy = false
102
143
  sleep(4)
103
144
  end
104
145
  end
@@ -114,9 +155,38 @@ module Aromancer
114
155
  "#{`echo $HOME`.strip}/.aromancer"
115
156
  end
116
157
 
158
+ def self.date_display(raw)
159
+ DateTime.parse(raw)&.strftime(Aromancer::DATE_FORMAT).downcase.gsub(" ", "_")
160
+ end
161
+
162
+ def self.time_display(raw)
163
+ DateTime.parse(raw)&.strftime(Aromancer::TIME_FORMAT).downcase.gsub(" ", "_")
164
+ end
165
+
166
+ def self.print_hud
167
+ print_last_error
168
+ websocket_status = "#{Aromancer::Storage.instance.get_key(:websocket_scheme)}: #{Aromancer::Websocket.instance.socket.nil? ? UNICODE[:close] : UNICODE[:check] }"
169
+ player_status = if Aromancer::Storage.get_player.nil?
170
+ I18n.t("routes.main_menu.not_signed_in")
171
+ else
172
+ I18n.t("shared.signed_in_as", as: Aromancer::Storage.get_player["alias"])
173
+ end
174
+
175
+ Aromancer::Prompt.say(
176
+ [nil, :v.to_s + Aromancer::VERSION, player_status, websocket_status, nil,].join(" | ")
177
+ )
178
+ end
179
+
117
180
  def self.print_last_error(i18n_key = nil)
181
+ if Time.now.to_f - Aromancer::Cli.instance.error_timeout.to_f >= Aromancer::ERROR_EXPIRATION
182
+ Aromancer::Cli.instance.error_timeout = Time.now.to_i
183
+ Aromancer::Storage.set_last_error(nil)
184
+ return
185
+ end
186
+
118
187
  last_error = Aromancer::Storage.get_last_error
119
188
  return if last_error.nil?
189
+
120
190
  last_error = last_error.symbolize_keys
121
191
  message = last_error[:body]
122
192
  begin
@@ -125,6 +195,13 @@ module Aromancer
125
195
  rescue JSON::ParserError => e
126
196
  message = last_error[:body]
127
197
  end
128
- Aromancer::Prompt.say(I18n.t(i18n_key, status: last_error[:status], error: message))
198
+
199
+ if message.kind_of?(Hash)
200
+ message = JSON.pretty_generate(message)
201
+ elsif message.kind_of?(String)
202
+ message = message[0..777]
203
+ end
204
+
205
+ Aromancer::Prompt.say(I18n.t(i18n_key || "shared.last_error", status: last_error[:status], error: message), rjust: true)
129
206
  end
130
207
  end
data/locale/en.yml CHANGED
@@ -11,6 +11,8 @@ en:
11
11
  navigate: "navigate to %{route}."
12
12
  update_cancel: "update cancelled."
13
13
  update_confirm: "confirm update [%{new_value}] (enter y): "
14
+ signed_in_as: "authenticated as %{as}"
15
+ last_error: "error (%{status}). %{error}"
14
16
  back: "back"
15
17
  exit: "exit"
16
18
  routes:
@@ -26,26 +28,31 @@ en:
26
28
  subtitle: ""
27
29
  new_game: "new game"
28
30
  load_game: "load game"
31
+ find_game: "find game"
32
+ rules: "rules"
29
33
  player_count: "enter player count (1-2): "
30
34
  sign_out: "sign out"
31
- not_signed_in: "not signed in. invalid session. redirecting to authentication."
35
+ not_signed_in: "signed out"
32
36
  configure:
33
37
  title: "configure %{name}"
34
38
  new_host: "enter new server host: "
35
39
  new_port: "enter new server port: "
36
- force_ssl_toggle: "force ssl preference toggled to %{value}"
40
+ force_ssl_toggle: "ssl preference toggled to %{value}"
37
41
  server_host: "host (%{stored})"
38
42
  server_port: "port (%{stored})"
39
- force_ssl: "force ssl (%{stored})"
43
+ force_ssl: "ssl (%{stored})"
44
+ debug: "debug (%{stored})"
45
+ debug_toggle: "debug preference toggled to %{value}"
40
46
  new_game:
41
- player_count: "number of players"
42
- story_count: "number of stories"
47
+ player_count: "players"
48
+ story_count: "stories"
43
49
  starting: "starting new game..."
44
50
  status: "status"
45
51
  cancelled: "cancelled. game not created."
46
52
  legend:
47
53
  title: "legend"
48
54
  subtitle: "%{subtitle}"
55
+ alchemy_for: "alchemy_for_%{name}:"
49
56
  arena_failed: "arena failed to load (%{status}). %{error}"
50
57
  scroll: "scroll"
51
58
  spoken_words: "scroll words"
@@ -61,6 +68,8 @@ en:
61
68
  place_on_scroll: "place %{word} on the scroll."
62
69
  options_for_word: "available options for the %{word} word."
63
70
  last_error: "last error"
71
+ returning_to_main: "returning to main menu..."
72
+ your_alchemy: "alchemy"
64
73
  legends:
65
74
  help: ""
66
75
  legend_menu:
@@ -69,5 +78,5 @@ en:
69
78
  help: ""
70
79
  stream:
71
80
  title: "stream"
72
-
73
-
81
+ end: "eos"
82
+ hide_title: "hide stream"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aromancer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - i2097i
@@ -245,6 +245,8 @@ files:
245
245
  - checksums/aromancer-0.0.3.gem.sha512
246
246
  - checksums/aromancer-0.0.4.gem.sha512
247
247
  - checksums/aromancer-0.0.5.gem.sha512
248
+ - checksums/aromancer-0.0.6.gem.sha512
249
+ - checksums/aromancer-0.0.7.gem.sha512
248
250
  - gem_graph.png
249
251
  - lib/aromancer.rb
250
252
  - lib/aromancer/.DS_Store