scaruby 0.0.4 → 0.0.5
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.
- data/lib/scaruby/concurrent.rb +46 -0
- data/lib/scaruby/{no_such_element_exception.rb → exception.rb} +2 -0
- data/lib/scaruby/io.rb +62 -0
- data/lib/scaruby/map.rb +3 -0
- data/lib/scaruby/option.rb +2 -2
- data/lib/scaruby/seq.rb +6 -8
- data/lib/scaruby/version.rb +1 -1
- data/lib/scaruby.rb +46 -10
- data/spec/scaruby/concurrent_spec.rb +31 -0
- data/spec/scaruby/io_spec.rb +56 -0
- data/spec/scaruby/map_spec.rb +8 -0
- data/spec/scaruby/seq_spec.rb +4 -2
- data/spec/scaruby_spec.rb +26 -1
- metadata +34 -20
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Scaruby
|
4
|
+
|
5
|
+
class Future
|
6
|
+
|
7
|
+
attr_accessor :result, :mutex
|
8
|
+
|
9
|
+
def initialize(mutex)
|
10
|
+
assert_type(mutex, Mutex)
|
11
|
+
@mutex = mutex
|
12
|
+
@result = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def get
|
16
|
+
@mutex.synchronize {
|
17
|
+
@result
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
module ConcurrentOps
|
24
|
+
|
25
|
+
def spawn(&block)
|
26
|
+
Thread.new do
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def future(&block)
|
32
|
+
f = Future.new(Mutex.new)
|
33
|
+
Thread.new do
|
34
|
+
f.mutex.synchronize do
|
35
|
+
f.result = yield
|
36
|
+
end
|
37
|
+
end
|
38
|
+
f
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
include Scaruby::ConcurrentOps
|
46
|
+
|
data/lib/scaruby/io.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module Scaruby
|
7
|
+
module IO
|
8
|
+
class Source
|
9
|
+
|
10
|
+
attr :string_io
|
11
|
+
|
12
|
+
def initialize(string_io)
|
13
|
+
assert_type(string_io, StringIO)
|
14
|
+
@string_io = string_io
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_bytes(bytes, encoding='UTF-8')
|
18
|
+
content = bytes.to_a.pack('c*').force_encoding(encoding)
|
19
|
+
Source.new(StringIO.new(content))
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.from_file(file, encoding='UTF-8')
|
23
|
+
content = ''
|
24
|
+
File::open(file, "r:#{encoding}") do |file|
|
25
|
+
while line = file.gets
|
26
|
+
content += line
|
27
|
+
end
|
28
|
+
end
|
29
|
+
Source.new(StringIO.new(content))
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.from_url(url, encoding='UTF-8')
|
33
|
+
uri = URI.parse(url)
|
34
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
35
|
+
http.use_ssl = uri.is_a?(URI::HTTPS)
|
36
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
37
|
+
|
38
|
+
http.start {|http|
|
39
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
40
|
+
res = http.request(req)
|
41
|
+
Source.new(StringIO.new(res.body))
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_lines
|
46
|
+
Seq.new(@string_io.map {|line| line })
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_seq
|
50
|
+
chars = []
|
51
|
+
while @string_io.eof? do
|
52
|
+
chars.push(@string_io.getc)
|
53
|
+
end
|
54
|
+
Seq.new(chars)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
include Scaruby::IO
|
62
|
+
|
data/lib/scaruby/map.rb
CHANGED
data/lib/scaruby/option.rb
CHANGED
data/lib/scaruby/seq.rb
CHANGED
@@ -4,6 +4,8 @@ module Scaruby
|
|
4
4
|
class Seq
|
5
5
|
include Enumerable
|
6
6
|
|
7
|
+
attr :array
|
8
|
+
|
7
9
|
def each(&block)
|
8
10
|
@array.each do |e|
|
9
11
|
yield e
|
@@ -16,11 +18,8 @@ module Scaruby
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def initialize(enumerable)
|
19
|
-
|
20
|
-
|
21
|
-
else
|
22
|
-
raise ArgumentError, 'Invalid argument (' + enumerable.to_s + ')'
|
23
|
-
end
|
21
|
+
assert_type(enumerable, Enumerable)
|
22
|
+
@array = enumerable.to_a
|
24
23
|
end
|
25
24
|
|
26
25
|
def to_a
|
@@ -170,7 +169,7 @@ module Scaruby
|
|
170
169
|
end
|
171
170
|
|
172
171
|
def indices
|
173
|
-
Seq.new(0.upto
|
172
|
+
Seq.new(0.upto(@array.length-1))
|
174
173
|
end
|
175
174
|
|
176
175
|
def init
|
@@ -236,7 +235,7 @@ module Scaruby
|
|
236
235
|
|
237
236
|
def partition(&predicate)
|
238
237
|
Seq.new(@array.chunk(&predicate).inject([[],[]]) {|z, matched_and_elm|
|
239
|
-
matched, elm = matched_and_elm[0], matched_and_elm[1]
|
238
|
+
matched, elm = matched_and_elm[0], matched_and_elm[1].first
|
240
239
|
if matched then
|
241
240
|
[z[0].push(elm), z[1]]
|
242
241
|
else
|
@@ -246,7 +245,6 @@ module Scaruby
|
|
246
245
|
end
|
247
246
|
|
248
247
|
def patch(from, patch, replaced)
|
249
|
-
# -- compatible with Ruby 1.8.7
|
250
248
|
#Seq.new(@array.take(from).concat(patch).concat(@array.drop(from).drop(replaced)))
|
251
249
|
Seq.new(@array.take(from) + patch + @array.drop(from).drop(replaced))
|
252
250
|
end
|
data/lib/scaruby/version.rb
CHANGED
data/lib/scaruby.rb
CHANGED
@@ -1,22 +1,58 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
require 'scaruby/appliable_proc'
|
4
|
+
require 'scaruby/concurrent'
|
5
|
+
require 'scaruby/converter'
|
6
|
+
require 'scaruby/io'
|
4
7
|
require 'scaruby/map'
|
5
|
-
require 'scaruby/
|
8
|
+
require 'scaruby/exception'
|
6
9
|
require 'scaruby/option'
|
7
10
|
require 'scaruby/seq'
|
8
11
|
require 'scaruby/version'
|
9
12
|
|
10
13
|
module Scaruby
|
11
|
-
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
module Commons
|
16
|
+
|
17
|
+
def assert_type(v, *types)
|
18
|
+
is_matched = false
|
19
|
+
unless v.nil? then
|
20
|
+
found = types.inject(false) {|found,type|
|
21
|
+
if found then true
|
22
|
+
else v.is_a?(type)
|
23
|
+
end
|
24
|
+
}
|
25
|
+
unless found then
|
26
|
+
raise AssertionError,
|
27
|
+
"The type of `#{v}` should be whichever of [#{types.join(', ')}] but actually #{v.class}."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
module Predef
|
35
|
+
|
36
|
+
def assert(assertion)
|
37
|
+
unless assertion then
|
38
|
+
raise AssertionError, 'Assertion failed'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def println(any)
|
43
|
+
puts any.to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
def read_line
|
47
|
+
input = readline
|
48
|
+
input.sub(/\r?\n/, '')
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
21
52
|
end
|
22
53
|
|
54
|
+
include Scaruby
|
55
|
+
include Scaruby::Commons
|
56
|
+
include Scaruby::Predef
|
57
|
+
|
58
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'scaruby'
|
4
|
+
|
5
|
+
describe Scaruby::ConcurrentOps do
|
6
|
+
it 'has #spawn' do
|
7
|
+
is_done = false
|
8
|
+
spawn do
|
9
|
+
sleep 0.3
|
10
|
+
is_done = true
|
11
|
+
end
|
12
|
+
is_done.should eq(false)
|
13
|
+
sleep 0.5
|
14
|
+
is_done.should eq(true)
|
15
|
+
end
|
16
|
+
it 'has #future' do
|
17
|
+
is_done = false
|
18
|
+
future = future {
|
19
|
+
sleep 0.3
|
20
|
+
is_done = true
|
21
|
+
sleep 0.5
|
22
|
+
:ok
|
23
|
+
}
|
24
|
+
is_done.should eq(false)
|
25
|
+
sleep 0.5
|
26
|
+
is_done.should eq(true)
|
27
|
+
future.get.should eq(:ok)
|
28
|
+
is_done.should eq(true)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'scaruby'
|
4
|
+
|
5
|
+
describe Scaruby::IO::Source do
|
6
|
+
|
7
|
+
http_url = 'http://seratch.github.com/'
|
8
|
+
https_url = 'https://github.com/seratch/scaruby'
|
9
|
+
|
10
|
+
it 'has from_file' do
|
11
|
+
file = 'spec/scaruby_spec.rb'
|
12
|
+
source = Source.from_file(file)
|
13
|
+
source.to_seq.foreach do |c|
|
14
|
+
line.is_a?(String).should eq(true)
|
15
|
+
end
|
16
|
+
lines = source.get_lines
|
17
|
+
lines.is_a?(Enumerable).should eq(true)
|
18
|
+
lines.foreach do |line|
|
19
|
+
line.is_a?(String).should eq(true)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
it 'has from_bytes' do
|
23
|
+
str = 'zzz 日本語を含む文字列 999'
|
24
|
+
bytes = str.bytes.to_a
|
25
|
+
source = Source.from_bytes(bytes)
|
26
|
+
source.to_seq.foreach do |c|
|
27
|
+
c.is_a?(String).should eq(true)
|
28
|
+
end
|
29
|
+
source.get_lines.mk_string.should eq(str)
|
30
|
+
end
|
31
|
+
it 'has from_url with a http url' do
|
32
|
+
source = Source.from_url(http_url)
|
33
|
+
source.to_seq.foreach do |c|
|
34
|
+
c.is_a?(String).should eq(true)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
it 'has from_url with a https url' do
|
38
|
+
source = Source.from_url(https_url)
|
39
|
+
source.to_seq.foreach do |c|
|
40
|
+
c.is_a?(String).should eq(true)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
it 'has #get_lines' do
|
44
|
+
source = Source.from_url(http_url,'Shift_JIS')
|
45
|
+
source.get_lines.foreach do |line|
|
46
|
+
line.is_a?(String).should eq(true)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
it 'has #to_seq' do
|
50
|
+
source = Source.from_url(http_url)
|
51
|
+
source.to_seq.foreach do |c|
|
52
|
+
c.is_a?(String).should eq(true)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
data/spec/scaruby/map_spec.rb
CHANGED
@@ -6,6 +6,14 @@ describe Map do
|
|
6
6
|
|
7
7
|
hash = {123 => 'abc', 234 => 'bcd', 345 => 'cde', 4 => 'd', 56 => 'ef', 7 => 'g', 89 => 'hi' }
|
8
8
|
|
9
|
+
it 'does not accept invalid args' do
|
10
|
+
begin
|
11
|
+
map = Map.new(1234)
|
12
|
+
raise 'Expected exception did not be raised!'
|
13
|
+
rescue AssertionError
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
9
17
|
it 'has self.new' do
|
10
18
|
map = Map.new({1 => 'a', 2 => 'b'})
|
11
19
|
map.should_not eq(nil)
|
data/spec/scaruby/seq_spec.rb
CHANGED
@@ -10,11 +10,13 @@ describe Seq do
|
|
10
10
|
it 'does not accept invalid args' do
|
11
11
|
begin
|
12
12
|
Seq.new('aaaa').should eq(nil)
|
13
|
-
|
13
|
+
raise 'Expected exception did not be raised!'
|
14
|
+
rescue AssertionError
|
14
15
|
end
|
15
16
|
begin
|
16
17
|
Seq.new(12345).should eq(nil)
|
17
|
-
|
18
|
+
raise 'Expected exception did not be raised!'
|
19
|
+
rescue AssertionError
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
data/spec/scaruby_spec.rb
CHANGED
@@ -1,7 +1,32 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
|
+
require 'scaruby'
|
4
|
+
|
3
5
|
describe Scaruby do
|
4
|
-
it '
|
6
|
+
it 'has assert_type' do
|
7
|
+
assert_type(123, Fixnum)
|
8
|
+
assert_type(123, String, Fixnum, Hash)
|
9
|
+
begin
|
10
|
+
assert_type(123, Hash, Array)
|
11
|
+
raise 'Expected exception did not be raised!'
|
12
|
+
rescue AssertionError => e
|
13
|
+
e.message.should eq('The type of `123` should be whichever of [Hash, Array] but actually Fixnum.')
|
14
|
+
end
|
15
|
+
assert_type([1,2,3], Array)
|
16
|
+
assert_type({1=>'a'}, Hash)
|
17
|
+
assert_type(nil, Array)
|
18
|
+
assert_type(nil, Hash)
|
19
|
+
end
|
20
|
+
it 'has assert' do
|
21
|
+
assert('1' != 1)
|
22
|
+
begin
|
23
|
+
assert('1' == 1)
|
24
|
+
raise 'Expected exception did not be raised!'
|
25
|
+
rescue AssertionError => e
|
26
|
+
end
|
27
|
+
end
|
28
|
+
it 'has converter' do
|
29
|
+
[1,2,3].to_scaruby.should_not eq(nil)
|
5
30
|
end
|
6
31
|
end
|
7
32
|
|
metadata
CHANGED
@@ -1,23 +1,28 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: scaruby
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.4
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Kazuhiro Sera
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
12
|
+
|
13
|
+
date: 2012-03-06 00:00:00 Z
|
13
14
|
dependencies: []
|
15
|
+
|
14
16
|
description: Scala API in Ruby
|
15
|
-
email:
|
17
|
+
email:
|
16
18
|
- seratch@gmail.com
|
17
19
|
executables: []
|
20
|
+
|
18
21
|
extensions: []
|
22
|
+
|
19
23
|
extra_rdoc_files: []
|
20
|
-
|
24
|
+
|
25
|
+
files:
|
21
26
|
- .gitignore
|
22
27
|
- .travis.yml
|
23
28
|
- Gemfile
|
@@ -25,52 +30,61 @@ files:
|
|
25
30
|
- Rakefile
|
26
31
|
- lib/scaruby.rb
|
27
32
|
- lib/scaruby/appliable_proc.rb
|
33
|
+
- lib/scaruby/concurrent.rb
|
28
34
|
- lib/scaruby/converter.rb
|
29
35
|
- lib/scaruby/core_ext.rb
|
30
36
|
- lib/scaruby/core_ext/enumerable.rb
|
31
37
|
- lib/scaruby/core_ext/hash.rb
|
38
|
+
- lib/scaruby/exception.rb
|
39
|
+
- lib/scaruby/io.rb
|
32
40
|
- lib/scaruby/map.rb
|
33
|
-
- lib/scaruby/no_such_element_exception.rb
|
34
41
|
- lib/scaruby/option.rb
|
35
42
|
- lib/scaruby/seq.rb
|
36
43
|
- lib/scaruby/version.rb
|
37
44
|
- readme.md
|
38
45
|
- scaruby.gemspec
|
46
|
+
- spec/scaruby/concurrent_spec.rb
|
39
47
|
- spec/scaruby/converter_spec.rb
|
40
48
|
- spec/scaruby/core_ext/enumerable_spec.rb
|
41
49
|
- spec/scaruby/core_ext/hash_spec.rb
|
50
|
+
- spec/scaruby/io_spec.rb
|
42
51
|
- spec/scaruby/map_spec.rb
|
43
52
|
- spec/scaruby/option_spec.rb
|
44
53
|
- spec/scaruby/seq_spec.rb
|
45
54
|
- spec/scaruby_spec.rb
|
46
55
|
homepage: https://github.com/seratch/scaruby
|
47
56
|
licenses: []
|
57
|
+
|
48
58
|
post_install_message:
|
49
59
|
rdoc_options: []
|
50
|
-
|
60
|
+
|
61
|
+
require_paths:
|
51
62
|
- lib
|
52
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
64
|
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
57
68
|
version: 1.9.2
|
58
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
70
|
none: false
|
60
|
-
requirements:
|
61
|
-
- -
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version:
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: "0"
|
64
75
|
requirements: []
|
76
|
+
|
65
77
|
rubyforge_project: scaruby
|
66
|
-
rubygems_version: 1.8.
|
78
|
+
rubygems_version: 1.8.15
|
67
79
|
signing_key:
|
68
80
|
specification_version: 3
|
69
81
|
summary: Scala API in Ruby
|
70
|
-
test_files:
|
82
|
+
test_files:
|
83
|
+
- spec/scaruby/concurrent_spec.rb
|
71
84
|
- spec/scaruby/converter_spec.rb
|
72
85
|
- spec/scaruby/core_ext/enumerable_spec.rb
|
73
86
|
- spec/scaruby/core_ext/hash_spec.rb
|
87
|
+
- spec/scaruby/io_spec.rb
|
74
88
|
- spec/scaruby/map_spec.rb
|
75
89
|
- spec/scaruby/option_spec.rb
|
76
90
|
- spec/scaruby/seq_spec.rb
|