subaltern 1.0.0

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,88 @@
1
+
2
+ require 'spec_helper'
3
+
4
+
5
+ describe Subaltern do
6
+
7
+ context Hash do
8
+
9
+ describe '{}' do
10
+
11
+ it 'returns the hash' do
12
+
13
+ Subaltern.eval('{}').should == {}
14
+ Subaltern.eval('{ 1 => 2, 3 => 4 }').should == { 1 => 2, 3 => 4 }
15
+ end
16
+ end
17
+
18
+ describe '#[]' do
19
+
20
+ it 'works' do
21
+
22
+ Subaltern.eval('{}["a"]').should == nil
23
+ Subaltern.eval('{ "a" => 1 }["a"]').should == 1
24
+ end
25
+ end
26
+
27
+ describe '.{key} (javascripty)' do
28
+
29
+ it 'works' do
30
+
31
+ Subaltern.eval('{ "a" => 1 }.a').should == 1
32
+ Subaltern.eval('{ "length" => "zero" }.length').should == 1
33
+ end
34
+ end
35
+
36
+ describe '#each' do
37
+
38
+ it 'works' do
39
+
40
+ Subaltern.eval('''
41
+ s = []
42
+ { "a" => 1, "b" => 2 }.each { |k, v| s << "#{k}:#{v}" }
43
+ s.join(", ")
44
+ ''').should == 'a:1, b:2'
45
+ end
46
+ end
47
+
48
+ describe '#collect' do
49
+
50
+ it 'works' do
51
+
52
+ Subaltern.eval('''
53
+ { "a" => 1, "b" => 2 }.collect do |k, v| "#{k}:#{v}"; end.join(", ")
54
+ ''').should == 'a:1, b:2'
55
+ end
56
+ end
57
+
58
+ describe '#inject' do
59
+
60
+ it 'works' do
61
+
62
+ Subaltern.eval(%{
63
+ { "a" => 1, "b" => 2 }.inject(0) { |sum, (k, v)| sum + v }
64
+ }).should == 3
65
+ end
66
+ end
67
+
68
+ describe '#select' do
69
+
70
+ it 'works' do
71
+
72
+ if ruby19?
73
+
74
+ Subaltern.eval('''
75
+ { "a" => 1, "b" => 2, "c" => 3 }.select { |k, v| v.odd? }
76
+ ''').should == { 'a' => 1, 'c' => 3 }
77
+
78
+ else
79
+
80
+ Subaltern.eval('''
81
+ { "a" => 1, "b" => 2, "c" => 3 }.select { |k, v| v.odd? }
82
+ ''').should == [ [ 'a', 1 ], [ 'c', 3 ] ]
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
@@ -0,0 +1,108 @@
1
+
2
+ require 'spec_helper'
3
+
4
+
5
+ describe Subaltern do
6
+
7
+ describe 'while' do
8
+
9
+ it 'works' do
10
+
11
+ Subaltern.eval(%{
12
+ x = nil
13
+ while true do
14
+ x = :ok
15
+ break
16
+ end
17
+ x
18
+ }).should == :ok
19
+ end
20
+
21
+ it 'works as modifier' do
22
+
23
+ Subaltern.eval(%{
24
+ x = nil
25
+ (x = :ok; break) while true
26
+ x
27
+ }).should == :ok
28
+ end
29
+ end
30
+
31
+ describe 'until' do
32
+
33
+ it 'works' do
34
+
35
+ Subaltern.eval(%{
36
+ x = nil
37
+ until false do
38
+ x = :ok
39
+ break
40
+ end
41
+ x
42
+ }).should == :ok
43
+ end
44
+
45
+ it 'works as modifier' do
46
+
47
+ Subaltern.eval(%{
48
+ x = nil
49
+ (x = :ok; break) until false
50
+ x
51
+ }).should == :ok
52
+ end
53
+ end
54
+
55
+ describe 'for x in xs' do
56
+
57
+ it 'works' do
58
+
59
+ Subaltern.eval(%{
60
+ a = []
61
+ for e in [ 1, 2, 3, 4 ]
62
+ a << e
63
+ end
64
+ a
65
+ }).should == [ 1, 2, 3, 4 ]
66
+ end
67
+
68
+ it 'does not create a new context' do
69
+
70
+ Subaltern.eval(%{
71
+ for i in [ 1 ]
72
+ a = i
73
+ end
74
+ a
75
+ }).should == 1
76
+ end
77
+ end
78
+
79
+ describe 'for k,v in h' do
80
+
81
+ it 'works' do
82
+
83
+ Subaltern.eval(%{
84
+ a = []
85
+ for k, v in { 'a' => 'b', 'c' => 'd' }
86
+ a << k + ':' + v
87
+ end
88
+ a
89
+ }).should == %w[ a:b c:d ]
90
+ end
91
+ end
92
+
93
+ describe 'loop' do
94
+
95
+ it 'works' do
96
+
97
+ Subaltern.eval(%{
98
+ a = 0
99
+ loop do
100
+ a = a + 1
101
+ break if a > 7
102
+ end
103
+ a
104
+ }).should == 8
105
+ end
106
+ end
107
+ end
108
+
@@ -0,0 +1,21 @@
1
+
2
+ require 'subaltern'
3
+
4
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each do |f|
5
+ require(f)
6
+ end
7
+
8
+ RSpec.configure do |config|
9
+
10
+ # == Mock Framework
11
+ #
12
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
13
+ #
14
+ # config.mock_with :mocha
15
+ # config.mock_with :flexmock
16
+ # config.mock_with :rr
17
+ config.mock_with :rspec
18
+
19
+ config.include SubalternHelper
20
+ end
21
+
@@ -0,0 +1,26 @@
1
+
2
+ require 'spec_helper'
3
+
4
+
5
+ describe Subaltern do
6
+
7
+ context String do
8
+
9
+ describe 'a literal String' do
10
+
11
+ it 'is returned as is' do
12
+
13
+ Subaltern.eval('"123"').should == '123'
14
+ end
15
+ end
16
+
17
+ describe 'string extrapolation' do
18
+
19
+ it 'happens' do
20
+
21
+ Subaltern.eval('"ab#{c}de"', 'c' => 'C').should == 'abCde'
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,9 @@
1
+
2
+ module SubalternHelper
3
+
4
+ def ruby19?
5
+
6
+ RUBY_VERSION.split('.')[0, 2].join('.').to_f > 1.8
7
+ end
8
+ end
9
+
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'lib/subaltern/version')
4
+ # bundler wants absolute path
5
+
6
+
7
+ Gem::Specification.new do |s|
8
+
9
+ s.name = 'subaltern'
10
+ s.version = Subaltern::VERSION
11
+ s.platform = Gem::Platform::RUBY
12
+ s.authors = [ 'John Mettraux' ]
13
+ s.email = [ 'jmettraux@gmail.com' ]
14
+ s.homepage = 'http://lambda.io'
15
+ s.rubyforge_project = 'ruote'
16
+ s.summary = 'an interpreter of a subset of Ruby, written in Ruby'
17
+ s.description = %{
18
+ an interpreter of a subset of Ruby, written in Ruby
19
+ }
20
+
21
+ #s.files = `git ls-files`.split("\n")
22
+ s.files = Dir[
23
+ 'Rakefile',
24
+ 'lib/**/*.rb', 'spec/**/*.rb', 'test/**/*.rb',
25
+ '*.gemspec', '*.txt', '*.rdoc', '*.md', '*.mdown'
26
+ ]
27
+
28
+ s.add_runtime_dependency 'ruby_parser', '>= 2.0.6'
29
+
30
+ s.add_development_dependency 'rspec'
31
+
32
+ s.require_path = 'lib'
33
+ end
34
+
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: subaltern
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
+ platform: ruby
12
+ authors:
13
+ - John Mettraux
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-02-05 00:00:00 +09:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: ruby_parser
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 2
32
+ - 0
33
+ - 6
34
+ version: 2.0.6
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ type: :development
50
+ version_requirements: *id002
51
+ description: "\n\
52
+ an interpreter of a subset of Ruby, written in Ruby\n "
53
+ email:
54
+ - jmettraux@gmail.com
55
+ executables: []
56
+
57
+ extensions: []
58
+
59
+ extra_rdoc_files: []
60
+
61
+ files:
62
+ - Rakefile
63
+ - lib/subaltern/context.rb
64
+ - lib/subaltern/errors.rb
65
+ - lib/subaltern/evaluator.rb
66
+ - lib/subaltern/kernel.rb
67
+ - lib/subaltern/version.rb
68
+ - lib/subaltern.rb
69
+ - spec/array_spec.rb
70
+ - spec/basics_spec.rb
71
+ - spec/boolean_spec.rb
72
+ - spec/context_spec.rb
73
+ - spec/control_flow_spec.rb
74
+ - spec/evil_spec.rb
75
+ - spec/fixnum_spec.rb
76
+ - spec/functions_spec.rb
77
+ - spec/hash_spec.rb
78
+ - spec/loops_spec.rb
79
+ - spec/spec_helper.rb
80
+ - spec/string_spec.rb
81
+ - spec/support/subaltern_helper.rb
82
+ - subaltern.gemspec
83
+ - CHANGELOG.txt
84
+ - LICENSE.txt
85
+ - TODO.txt
86
+ - README.md
87
+ has_rdoc: true
88
+ homepage: http://lambda.io
89
+ licenses: []
90
+
91
+ post_install_message:
92
+ rdoc_options: []
93
+
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ hash: 3
111
+ segments:
112
+ - 0
113
+ version: "0"
114
+ requirements: []
115
+
116
+ rubyforge_project: ruote
117
+ rubygems_version: 1.6.2
118
+ signing_key:
119
+ specification_version: 3
120
+ summary: an interpreter of a subset of Ruby, written in Ruby
121
+ test_files: []
122
+