neofugo_client 0.1.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ae350873d6d5289db3b32e6c9bbd9dc615ffc905
4
+ data.tar.gz: e80a24c7aa733414d00576795501ab2f584d59a8
5
+ SHA512:
6
+ metadata.gz: 28f61bf81eb23d697e15d3ed4537e318fc0cb1af0b6e158b1843708cee9efcddac94a33b61cbaa731ce681d20c17f909e896893740f3061c03f9005714d3f342
7
+ data.tar.gz: 7c81ccf07552993f5fceb017a8c247e12d3942d46ccc4d11d39de92bc9c96b10cc5648416219cb476e7f9eebf6c5aa10981e50a506adb0f2462e4be264c44e43
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /vendors
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in neofugo_client.gemspec
4
+ gemspec
@@ -0,0 +1,130 @@
1
+ # NeofugoClient
2
+
3
+ [株式会社ネオジニア](http://www.neogenia.co.jp)のサービス「[ネオ富豪](http://neof5.neogenia.co.jp)」にRubyプログラムから参加するのを簡略化するgemです。
4
+
5
+ ## インストール
6
+ 下記コマンドでgemをインストールします。
7
+
8
+ $ gem install neofugo_client
9
+
10
+ ## サンプル
11
+
12
+ sampleディレクトリに、ただ単純に手札を出すだけのサンプルクライアントを置いています。
13
+
14
+ ## 前提
15
+ ネオ富豪はサーバとWebSocketを使用して通信します。
16
+ 通信内容の仕様は公式サイトの[プログラム仕様](http://neof5.neogenia.co.jp/spec/)を確認してください。
17
+
18
+ ごく簡単に説明すると
19
+ - サーバと接続する
20
+ - サーバから各種情報を受信する
21
+ - 受信した内容から自分の出す札を決定する
22
+ - 決定した札をサーバに送信する
23
+
24
+ を繰り返します。この内、
25
+
26
+ - 受信した内容から自分の出す札を決定する
27
+
28
+ *以外*の部分をこのライブラリがサポートし、何を出すかの部分だけを実装すると
29
+ ネオ富豪のクライアントとして動作するようになります。
30
+
31
+ #### ネオ富豪サーバからのメッセージ概要
32
+
33
+ サーバからは以下のようなメッセージが送信されます。
34
+
35
+ ```js
36
+ {
37
+ "YourNum":0, // 受信者の番号(接続順に0から振られます)
38
+ "Kind":"ProcessTurn", // ゲーム内で起こったイベントの種類
39
+ "Teban":0, // 現在の手番(プレイヤー番号)
40
+ "IsKakumei":false, // 革命中かどうか
41
+ "PlayerInfo":[ // 対戦中のプレイヤーの情報
42
+ {"Name":"ExampleProgram","HavingCardCount":11,"Ranking":0,"OrderOfFinish":0},
43
+ {"Name":"COM1","HavingCardCount":11,"Ranking":0,"OrderOfFinish":0},
44
+ {"Name":"COM2","HavingCardCount":10,"Ranking":0,"OrderOfFinish":0},
45
+ {"Name":"COM3","HavingCardCount":9,"Ranking":0,"OrderOfFinish":0},
46
+ {"Name":"COM4","HavingCardCount":9,"Ranking":0,"OrderOfFinish":0}],
47
+ "Deck":"D3 H3 D4 S7 H9 D0 SJ CQ SQ DA JK", // 現在の手札(1枚のカードを2文字で表します)
48
+ "Ba":["S3","D5","S6"], // 場に出ているカード
49
+ "Yama":"", // 山にあるカード(流れたカード)
50
+ "History":["2-[S3]","3-[D5]","4-[S6]"] // ゲームの初手から現在局面までの手の全履歴
51
+ }
52
+ ```
53
+
54
+ この中で`Kind`の値が`ProcessTurn`の場合、「あなた」の手番が回ってきたことになるので、
55
+ このメッセージを受信したときに出す手を決めてサーバに返すとゲームが進行していきます。
56
+
57
+ #### NeofugoClient概要
58
+ NeofugoClientは
59
+
60
+ - サーバと指定した部屋(練習用の部屋、本番勝負用の部屋などがあります)にアクセスし、メッセージを送受信する部分
61
+ - 「あなた」のロジックを実装する部分
62
+
63
+ に分かれています。
64
+ 上記で「`Kind`の値が`ProcessTrun`の場合」と書きましたが、そのあたりはライブラリ側が処理するので、
65
+ 実際に実装するのは`Strategy`クラスを継承したの特定のメソッドのみになります。
66
+ `Strategy`クラスを継承すると予めサーバからのメッセージの`Kind`に対応したメソッドが定義されているので、
67
+ その中で反応したいメッセージに対応するメソッドのみオーバーライドしてロジックを完成させてください。
68
+
69
+ #### 最小限のサンプル
70
+ 基本的には`Kind=PorcessTrun`に反応すれば良いため対応する`on_process_turn`をオーバーライドします。
71
+ また選んだカードを送信するには、(これもネオ富豪のメッセージに変換されますが)`put()`で出すカードを指定します。
72
+
73
+ ```ruby
74
+ require "neofugo_client"
75
+
76
+ class MyStrategy < NeofugoClient::Strategy
77
+ def on_process_turn(m)
78
+ cards = your_comprelex_daifugo_logic(m)
79
+ puts(cards)
80
+ end
81
+ end
82
+ ```
83
+
84
+ 引数の`m`は先程載せたメッセージの`json`データをRubyのオブジェクトに変換したものです。
85
+
86
+ - メッセージ全体は`Message`クラスに該当します
87
+ - メッセージ直下にあるプロパティはプロパティー名をスネークケースにしたインスタンス変数として保持しています。例) `YourNum` => @your_num
88
+ - `@player_info`は`PlayerInfo`クラスの配列です。
89
+ - `@deck`は`Card`クラスの配列です。
90
+ - `@ba`は`Card`クラスの配列の配列です。
91
+ - `@yama`は`Card`クラスの配列です。
92
+ - `@history`は`History`クラスの配列です。
93
+
94
+ この内、最もロジックに関連する変数は`ba`(今現在場に出ているカード)と`deck`(今あなたが持っているカード)です。
95
+ どちらも`Card`クラスが元になっているため、`Card`クラスの概要を下記に記載します。
96
+ メッセージ上カードがどう表されるかは公式サイトを参照してください。
97
+ このライブラリ上では`Card`クラスは3つのプロパティで表現されます。
98
+
99
+ ```ruby
100
+ class Card
101
+ def initialize
102
+ @type #カードの種類を表す文字列です。クラブ: C, ハート: H, ダイヤ: D, スペード: S, ただしJokerの場合JKです。
103
+ @mark #カードに書かれている数字です。A, 2, 3, 4, ... J, Q, K。ただしJokerの場合`nil`です。
104
+ @value #革命時でない場合のカードの強さを表します。3から順に, 0, 1, 2, 3, 4, 5
105
+ end
106
+ end
107
+ ```
108
+
109
+ この`Card`クラスのインスタンスが`ba`, `deck`を構成しています。
110
+ `deck`は単純に今「あなた」が持っている`Card`の配列です。
111
+
112
+ `ba`は今場に出ているカードの状態です。流れた場合は`[]`配列です。
113
+ `ba`については1回に複数枚出すパターンがありえるので、「`Card`の配列の配列」で保持しています。
114
+
115
+ - カードが1枚ずつ3人から`c1, c2, c3`の順で出された
116
+
117
+ `ba = [[c1], [c2], [c3]]`
118
+
119
+ - カードが2枚ずつ二人から`(c1-1, c1-2), (c2-1, c2-2)`の順で出された
120
+
121
+ `ba = [[c1-1, c1-2], [c2-1, c2-2]]`
122
+
123
+ という形で取得できます。直接的には最後の手順に対して出せる札が決まるので最後の要素を解析して出す札を決めてください。
124
+
125
+ #### その他
126
+ ネオ富豪のメッセージは、常に最新のメッセージ一つの中に今までのゲームの状態を取得するための情報をすべて保持しているため
127
+ 上記までで説明していない変数などを利用して有利なロジックを考えてみてください。
128
+ 例えば、今までに出された札(`history`)と自分が今持っているカード(`deck`)を解析すれば、少なくともこのカードはもう
129
+ 自分しか持っていないはず、などが推測出来ると思います。
130
+
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,91 @@
1
+ require 'json'
2
+
3
+ require 'websocket-client-simple'
4
+
5
+ require "neofugo_client/version"
6
+ require 'neofugo_client/util/util'
7
+ require 'neofugo_client/base'
8
+ require 'neofugo_client/test_connection'
9
+ require 'neofugo_client/test_rule_test'
10
+ require 'neofugo_client/test_practice'
11
+ require 'neofugo_client/strategy'
12
+
13
+ module NeofugoClient
14
+ class PlayerInfo
15
+ attr_accessor :name, :having_card_count, :ranking, :order_of_finish
16
+
17
+ def to_s
18
+ inspect
19
+ end
20
+
21
+ def inspect
22
+ "(Player name:r#{@name}, having_card_count: #{@having_card_count}, ranking: #{@ranking}, order_of_finish: #{@order_of_finish})"
23
+ end
24
+ end
25
+
26
+ class Message
27
+ attr_accessor :your_num, :kind, :teban, :is_kakumei, :player_info, :deck, :ba, :yama, :history, :message
28
+ def inspect
29
+ "(your_num: #{@your_num}, kind: #{@kind}, teban: #{@teban}, is_kakumei: #{@is_kakumei}, player_info: #{@player_info}, deck: #{@deck}, ba: #{@ba}, yama: #{@yama}, history: #{@history}, message: #{@message})"
30
+ end
31
+ end
32
+
33
+ class Card
34
+ MARK_TO_VALUE = {
35
+ '3' => 0,
36
+ '4' => 1,
37
+ '5' => 2,
38
+ '6' => 3,
39
+ '7' => 4,
40
+ '8' => 5,
41
+ '9' => 6,
42
+ '0' => 7,
43
+ 'J' => 8,
44
+ 'Q' => 9,
45
+ 'K' => 10,
46
+ 'A' => 11,
47
+ '2' => 12,
48
+ 'JK' => 13
49
+ }
50
+ attr_accessor :type, :mark, :value
51
+
52
+ def to_card_string
53
+ [@type, @mark].join
54
+ end
55
+
56
+ def to_s
57
+ inspect
58
+ end
59
+
60
+ def inspect
61
+ [@type, @mark, ["(", @value, ")"].join].join
62
+ end
63
+
64
+ class << self
65
+ def to_card(e)
66
+ c = Card.new
67
+ if e == 'JK'
68
+ c.type = 'JK'
69
+ c.mark = nil
70
+ c.value = MARK_TO_VALUE['JK']
71
+ else
72
+ c.type = e[0]
73
+ c.mark = e[1]
74
+ #p [:mark_to_value, e[1], MARK_TO_VALUE[e[1]], MARK_TO_VALUE]
75
+ c.value = MARK_TO_VALUE[e[1]]
76
+ end
77
+ c
78
+ end
79
+ end
80
+ end
81
+
82
+ class History
83
+ attr_accessor :player_num, :action, :cards
84
+ def to_s
85
+ inspect
86
+ end
87
+ def inspect
88
+ "(Hist player_num: #{@player_num}, action: #{@action}, cards: #{@cards})"
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,145 @@
1
+ module NeofugoClient
2
+ using Util::StringEx
3
+ class Base
4
+ class << self
5
+ def create(opts={})
6
+ client = self.new(opts)
7
+ yield client
8
+ client
9
+ end
10
+ end
11
+
12
+ attr_accessor :host, :port, :verbose, :strategy_class
13
+ def initialize(opts = {})
14
+ @host = opts['host'] || 'neof5master.azurewebsites.net'
15
+ @port = opts['port'] || 80
16
+ @ws_handler = nil
17
+ @finished = false
18
+ end
19
+
20
+ def run()
21
+ @ws = WebSocket::Client::Simple.connect(build_url)
22
+ @strategy = @strategy_class.new(@ws)
23
+ handle
24
+
25
+ loop do
26
+ if @finished
27
+ @ws.close
28
+ break
29
+ end
30
+ end
31
+ end
32
+
33
+ def handle
34
+ this = self
35
+ ws = @ws
36
+ ws.on :message do |msg|
37
+ if msg.data == 'ping'
38
+ ws.send(nil, :type => :pong)
39
+ else
40
+ this.on_message(msg)
41
+ end
42
+ end
43
+
44
+ ws.on :open do
45
+ this.on_open
46
+ end
47
+
48
+ ws.on :close do |e|
49
+ this.on_close(e)
50
+ end
51
+
52
+ ws.on :error do |e|
53
+ this.on_error(e)
54
+ end
55
+ end
56
+
57
+ def on_open()
58
+ end
59
+
60
+ def on_close(e)
61
+ end
62
+
63
+ def on_error(e)
64
+ end
65
+
66
+ def on_message(msg)
67
+ begin
68
+ obj = parse_message(msg)
69
+ dispatch_by_kind(obj)
70
+ rescue => e
71
+ STDERR.puts e
72
+ STDERR.puts e.backtrace.join("\n")
73
+ end
74
+ end
75
+
76
+ def build_base_websocket_url()
77
+ "ws://#{@host}:#{@port}"
78
+ end
79
+
80
+ def list_to_card_list(card_list_string)
81
+ card_list_string.split(/ /).map {|e|
82
+ Card.to_card(e)
83
+ }
84
+ end
85
+
86
+ def dispatch_by_kind(obj)
87
+ result = @strategy.send("on_" + obj.kind.pascal_to_snake, obj)
88
+ if obj.kind == "Finish"
89
+ @finished = true
90
+ end
91
+ end
92
+
93
+ def parse_message(msg)
94
+ begin
95
+ j = JSON.parse(msg.data)
96
+
97
+ m = Message.new
98
+ m.kind = j['Kind']
99
+ if %w(Tweet Exception).include?(j['Kind'])
100
+ m.message = j['Message']
101
+ return m
102
+ end
103
+
104
+ m.your_num = j["YourNum"]
105
+ m.teban = j['Teban']
106
+ m.is_kakumei = j['IsKakumei']
107
+ m.player_info = j['PlayerInfo'].map {|e|
108
+ pi = PlayerInfo.new
109
+ pi.name = e['Name']
110
+ pi.having_card_count = e['HavingCardCount']
111
+ pi.ranking = e['Ranking']
112
+ pi.order_of_finish = e['OrderOfFinish']
113
+ pi
114
+ }
115
+ m.deck = list_to_card_list(j['Deck'])
116
+ #p [:ba_raw, j['Ba']]
117
+ m.ba = j['Ba'].map{|e| list_to_card_list(e)}
118
+ m.yama = j['Yama']
119
+ m.history = j['History'].map {|e|
120
+ a = History.new
121
+ if e[0] == '/'
122
+ a.action = :nagare
123
+ else
124
+ a.player_num = e[0].to_i
125
+ if e[2] == 'P'
126
+ a.action = :pass
127
+ elsif e[2] == 'A'
128
+ a.action = :agari
129
+ else
130
+ a.action = :player_action
131
+ end
132
+ if /\[([^\]]+)\]/ =~ e
133
+ a.cards = list_to_card_list(Regexp.last_match(1))
134
+ end
135
+ end
136
+ a
137
+ }
138
+ m
139
+ rescue => e
140
+ p e
141
+ end
142
+ end
143
+ end
144
+ end
145
+
@@ -0,0 +1,62 @@
1
+ module NeofugoClient
2
+ class Strategy
3
+ def initialize(ws)
4
+ @ws = ws
5
+ end
6
+
7
+ def put(cards)
8
+ json = {
9
+ "Kind": "Put",
10
+ "Cards": cards.map(&:to_card_string).join(" ")
11
+ }.to_json
12
+ puts "put -----------------------------------"
13
+ p json
14
+ @ws.send(json)
15
+ end
16
+
17
+ def tweet(msg)
18
+ @ws.send({
19
+ "Kind": "Tweet",
20
+ "Message": msg
21
+ }.to_json)
22
+ end
23
+
24
+ def on_start(m)
25
+ end
26
+
27
+ def on_card_distributed(m)
28
+ end
29
+
30
+ def on_card_swapped(m)
31
+ end
32
+
33
+ def on_thinking(m)
34
+ end
35
+
36
+ def on_process_turn(m)
37
+ end
38
+
39
+ def on_cards_are_put(m)
40
+ end
41
+
42
+ def on_kakumei(m)
43
+ end
44
+
45
+ def on_nagare(m)
46
+ end
47
+
48
+ def on_agari(m)
49
+ end
50
+
51
+ def on_finish(m)
52
+ end
53
+
54
+ def on_tweet(m)
55
+ end
56
+
57
+ def on_exception(m)
58
+ puts "exception -------------------------------------------------------"
59
+ p m
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,13 @@
1
+ module NeofugoClient
2
+ class TestConnection < Base
3
+ attr_accessor :name
4
+ def initialize(opts = {})
5
+ super(opts)
6
+ end
7
+
8
+ def build_url()
9
+ build_base_websocket_url + "/test/connection?name=#{@name}"
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,13 @@
1
+ module NeofugoClient
2
+ class TestPractice < Base
3
+ attr_accessor :name, :room_id
4
+ def initialize(opts = {})
5
+ super(opts)
6
+ end
7
+
8
+ def build_url()
9
+ build_base_websocket_url + "/test/practice/#{@room_id}?name=#{@name}"
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,13 @@
1
+ module NeofugoClient
2
+ class TestRuleTest < Base
3
+ attr_accessor :name, :room_id
4
+ def initialize(opts = {})
5
+ super(opts)
6
+ end
7
+
8
+ def build_url()
9
+ build_base_websocket_url + "/test/ruletest/#{@room_id}?name=#{@name}"
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,11 @@
1
+ module NeofugoClient
2
+ module Util
3
+ module StringEx
4
+ refine String do
5
+ def pascal_to_snake
6
+ self.scan(/[A-Z][^A-Z]+/).map(&:downcase).join("_")
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module NeofugoClient
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'neofugo_client/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "neofugo_client"
8
+ spec.version = NeofugoClient::VERSION
9
+ spec.authors = ["pocari"]
10
+ spec.email = ["caffelattenonsugar@gmail.com"]
11
+
12
+ spec.summary = %q{Neofugo client by ruby}
13
+ spec.description = %q{This library can implement Neofugo Client easy.}
14
+ spec.homepage = "https://github.com/pocari"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.10"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "pry"
26
+
27
+ spec.add_dependency "websocket-client-simple", "~> 0.2.2"
28
+ end
@@ -0,0 +1,75 @@
1
+ $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
2
+ require "neofugo_client"
3
+
4
+ require 'open-uri'
5
+
6
+ def get_new_room_id
7
+ str = open('http://neof5master.azurewebsites.net/playroom/practice/B').read
8
+ if /<pre>(.*)<\/pre>/ =~ str
9
+ ws_url = Regexp.last_match(1)
10
+ if /(P\d+)/ =~ ws_url
11
+ Regexp.last_match(1)
12
+ end
13
+ end
14
+ end
15
+
16
+ class MyStrategy < NeofugoClient::Strategy
17
+ def on_start(m)
18
+ puts "start----------------------------------------"
19
+ tweet("よろしくお願いします")
20
+ end
21
+
22
+ def on_finish(m)
23
+ puts "finish----------------------------------------"
24
+ p m
25
+ tweet("お疲れ様でした")
26
+ end
27
+
28
+ def build_pattern(deck, n)
29
+ deck.chunk{|e|
30
+ e.value
31
+ }.select {|e, ch|
32
+ ch.size >= n
33
+ }.map {|e, ch|
34
+ [e, ch.first(n)]
35
+ }
36
+ end
37
+
38
+ def on_process_turn(m)
39
+ puts "process trun --------------------------------------------------->"
40
+ p [:ba, m.ba]
41
+ p [:deck, m.deck]
42
+
43
+ last = m.ba.last
44
+ cards = nil
45
+ if !last
46
+ cards = 4.downto(1).map{|e| build_pattern(m.deck, e)}.find{|e| e.size > 0}.first[1]
47
+ else
48
+ pattern = build_pattern(m.deck, last.size)
49
+
50
+ n, cards = pattern.find {|e, ch|
51
+ if m.is_kakumei
52
+ last.first.value > e
53
+ else
54
+ last.first.value < e
55
+ end
56
+ }
57
+ end
58
+
59
+ p [:cards, cards]
60
+ tweet("action: #{cards}")
61
+ put(cards ? cards : [])
62
+ end
63
+ end
64
+
65
+ room_id = ARGV.shift || get_new_room_id
66
+ client = NeofugoClient::TestPractice.create do |c|
67
+ c.verbose = true
68
+ c.name = 'Sample'
69
+ c.room_id = room_id
70
+ c.strategy_class = MyStrategy
71
+ end
72
+
73
+ puts "playroom id: #{room_id}"
74
+ client.run
75
+
metadata ADDED
@@ -0,0 +1,130 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: neofugo_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - pocari
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-10-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
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
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: websocket-client-simple
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.2.2
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.2.2
83
+ description: This library can implement Neofugo Client easy.
84
+ email:
85
+ - caffelattenonsugar@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - Gemfile
94
+ - README.md
95
+ - Rakefile
96
+ - lib/neofugo_client.rb
97
+ - lib/neofugo_client/base.rb
98
+ - lib/neofugo_client/strategy.rb
99
+ - lib/neofugo_client/test_connection.rb
100
+ - lib/neofugo_client/test_practice.rb
101
+ - lib/neofugo_client/test_rule_test.rb
102
+ - lib/neofugo_client/util/util.rb
103
+ - lib/neofugo_client/version.rb
104
+ - neofugo_client.gemspec
105
+ - sample/neofugo_client_sample.rb
106
+ homepage: https://github.com/pocari
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 2.4.5
127
+ signing_key:
128
+ specification_version: 4
129
+ summary: Neofugo client by ruby
130
+ test_files: []