typist 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2757d8cd18bfb8ebf6112c05e260f20805f6fb4d
4
- data.tar.gz: b5a017f46fba7063f1d8661bfadc2dca4876f0bd
3
+ metadata.gz: 17bc1b93c362a0acb4e9a516fe1cb6c85a8c12a3
4
+ data.tar.gz: 3cd4d3c01a379011988c50e9031a84a1925ecaec
5
5
  SHA512:
6
- metadata.gz: 175cca390f72642c375d281d836c90a38bbad5bb774049babbb17b3a626a2e74fc1fe51971cb6af2549f867dad42027cfdb12ef33d37728077b0bf8cccc96086
7
- data.tar.gz: e0502bdfa7442b48ae9a7baae0985c4f49c353bbeedcccf759f03e46755fbd18cc3f81573878803c06c42d1a396e414295fd66b6149d20af74ec799c01d0d6ee
6
+ metadata.gz: eb13350571688260b0f45e3b7892d3a9208f213adac413d156f1ee42688d9d15731c5f8402d1059d21e10aaca32b3ca9a38f406de697b1ecff034533baf5cbbe
7
+ data.tar.gz: c737d01ea3eb776eb4fcc337ca00638cc6a27d53ad2e096f0be98cefb8ca6fb1cdc134dc106802b3aac963a3abec7dab4ab6311d0df78f7dcf75d2740a3ef2b6
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # typist
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/typist.png)](http://badge.fury.io/rb/typist)
3
4
  [![Build Status](https://travis-ci.org/nahiluhmot/typist.png?branch=master)](https://travis-ci.org/nahiluhmot/typist)
4
5
  [![Code Climate](https://codeclimate.com/github/nahiluhmot/typist.png)](https://codeclimate.com/github/nahiluhmot/typist)
5
6
 
@@ -113,7 +114,7 @@ Example usage:
113
114
 
114
115
  ```ruby
115
116
  leaf = Tree.leaf
116
- node = Tree.node(:value => 'a', :left => Tree.leaf, right => Tree.leaf)
117
+ node = Tree.node(:value => 'a', :left => Tree.leaf, :right => Tree.leaf)
117
118
 
118
119
  leaf.contains?('a')
119
120
  # => false
@@ -1,11 +1,12 @@
1
1
  # This is the top level module for the gem, used as a namespace and as a
2
2
  # location for high-level functions.
3
3
  module Typist
4
- autoload :Constructor, 'typist/constructor'
5
- autoload :Data, 'typist/data'
6
- autoload :Error, 'typist/error'
7
- autoload :Func, 'typist/func'
8
- autoload :Util, 'typist/util'
4
+ require 'typist/constructor'
5
+ require 'typist/data'
6
+ require 'typist/data_func'
7
+ require 'typist/error'
8
+ require 'typist/func'
9
+ require 'typist/util'
9
10
 
10
11
  # Define a new data type.
11
12
  def data(*args, &block)
@@ -1,6 +1,6 @@
1
1
  # Instances of this class may be included like a module.
2
2
  class Typist::Data
3
- attr_reader :name, :constructors, :funcs, :block
3
+ attr_reader :name, :constructors, :funcs, :data_funcs, :block
4
4
 
5
5
  # Create a new data type with the given name. The block will be evaluated in
6
6
  # the context of the new instance.
@@ -8,6 +8,7 @@ class Typist::Data
8
8
  @name = name
9
9
  @constructors = []
10
10
  @funcs = []
11
+ @data_funcs = []
11
12
  @block = block
12
13
  end
13
14
 
@@ -21,6 +22,11 @@ class Typist::Data
21
22
  funcs << Typist::Func.new(*args, &block)
22
23
  end
23
24
 
25
+ # Define a function whose receiver is the data type.
26
+ def data_func(*args, &block)
27
+ data_funcs << Typist::DataFunc.new(*args, &block)
28
+ end
29
+
24
30
  # Get the module that is defined.
25
31
  def get_module
26
32
  @module ||= Module.new
@@ -33,6 +39,7 @@ class Typist::Data
33
39
  instance_eval(&block) unless block.nil?
34
40
  constructors.each { |constructor| constructor.define!(context) }
35
41
  funcs.each { |func| func.define!(context) }
42
+ data_funcs.each { |func| func.define!(context) }
36
43
  end
37
44
  end
38
45
  end
@@ -0,0 +1,15 @@
1
+ # A DataFunc is Typist's equivalent of a class method.
2
+ class Typist::DataFunc
3
+ attr_reader :name, :block
4
+
5
+ # Create a new DataFunc.
6
+ def initialize(name, &block)
7
+ @name = name
8
+ @block = block
9
+ end
10
+
11
+ # Define a DataFunc in the given context.
12
+ def define!(context)
13
+ context.define_singleton_method(name, &block)
14
+ end
15
+ end
@@ -1,4 +1,4 @@
1
1
  # This file holds version information for the gem.
2
2
  module Typist
3
- VERSION = '0.0.1'
3
+ VERSION = '0.0.2'
4
4
  end
@@ -5,11 +5,11 @@ describe Typist::Constructor do
5
5
  subject { described_class.new(:Node, :value, :left, :right) }
6
6
 
7
7
  it 'sets the @name instance variable' do
8
- subject.name.should == :Node
8
+ expect(subject.name).to eq(:Node)
9
9
  end
10
10
 
11
11
  it 'sets the @vars instance variable' do
12
- subject.vars.should == [:value, :left, :right]
12
+ expect(subject.vars).to eq([:value, :left, :right])
13
13
  end
14
14
  end
15
15
 
@@ -17,7 +17,7 @@ describe Typist::Constructor do
17
17
  subject { described_class.new(:Leaf) }
18
18
 
19
19
  it 'returns a Class' do
20
- subject.get_class.should be_a Class
20
+ expect(subject.get_class).to be_a(Class)
21
21
  end
22
22
  end
23
23
 
@@ -33,19 +33,19 @@ describe Typist::Constructor do
33
33
  }
34
34
 
35
35
  it 'has each @var as an accessor' do
36
- instance.should respond_to(:arg1)
37
- instance.should respond_to(:arg2)
38
- instance.should_not respond_to(:arg3)
36
+ expect(instance).to respond_to((:arg1))
37
+ expect(instance).to respond_to((:arg2))
38
+ expect(instance).to_not respond_to(:arg3)
39
39
  end
40
40
 
41
41
  it 'accepts a hash in its initializer which sets instance variables' do
42
- instance.instance_variable_get(:@arg1).should == ?a
43
- instance.instance_variable_get(:@arg2).should == ?b
44
- instance.instance_variable_get(:@arg3).should == ?c
42
+ expect(instance.instance_variable_get(:@arg1)).to eq('a')
43
+ expect(instance.instance_variable_get(:@arg2)).to eq('b')
44
+ expect(instance.instance_variable_get(:@arg3)).to eq('c')
45
45
  end
46
46
 
47
47
  it 'includes the given module' do
48
- subject.get_class.ancestors.should include(mod)
48
+ expect(subject.get_class.ancestors).to include(mod)
49
49
  end
50
50
  end
51
51
 
@@ -53,9 +53,9 @@ describe Typist::Constructor do
53
53
  let(:instance) { mod.test_class(:arg1 => 1, :arg2 => 2) }
54
54
 
55
55
  it 'defines a method to create an instance of the defined class' do
56
- instance.should be_a mod::TestClass
57
- instance.arg1.should == 1
58
- instance.arg2.should == 2
56
+ expect(instance).to be_a(mod::TestClass)
57
+ expect(instance.arg1).to eq(1)
58
+ expect(instance.arg2).to eq(2)
59
59
  end
60
60
  end
61
61
  end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typist::DataFunc do
4
+ describe '#initialize' do
5
+ let(:name) { :test_func }
6
+ let(:block) { proc { |x| x.succ } }
7
+ subject { Typist::DataFunc.new(name, &block) }
8
+
9
+ it 'creates a new DataFunc with the given name and block' do
10
+ expect(subject.name).to eq(name)
11
+ expect(subject.block.call(1)).to eq(2)
12
+ end
13
+ end
14
+
15
+ describe '#define!' do
16
+ let(:name) { :chomp }
17
+ let(:block) { proc { |str| str.chomp } }
18
+ let(:mod) { Module.new }
19
+ subject { Typist::DataFunc.new(name, &block) }
20
+
21
+ before { subject.define!(mod) }
22
+
23
+ it 'defines its @name on the given module' do
24
+ expect(mod.chomp("test\n")).to eq('test')
25
+ end
26
+ end
27
+ end
@@ -6,15 +6,15 @@ describe Typist::Data do
6
6
  subject { described_class.new(:Test) }
7
7
 
8
8
  it 'sets the @name' do
9
- subject.name.should == :Test
9
+ expect(subject.name).to eq(:Test)
10
10
  end
11
11
 
12
12
  it 'sets the @constructors to []' do
13
- subject.constructors.should be_empty
13
+ expect(subject.constructors).to be_empty
14
14
  end
15
15
 
16
16
  it 'sets the @funcs to []' do
17
- subject.funcs.should be_empty
17
+ expect(subject.funcs).to be_empty
18
18
  end
19
19
  end
20
20
 
@@ -34,7 +34,7 @@ describe Typist::Data do
34
34
  expect { subject.constructor(:Leaf) }
35
35
  .to change { subject.constructors.length }.by(1)
36
36
 
37
- subject.constructors.should be_all { |constructor|
37
+ expect(subject.constructors).to be_all { |constructor|
38
38
  constructor.is_a?(Typist::Constructor)
39
39
  }
40
40
  end
@@ -43,12 +43,25 @@ describe Typist::Data do
43
43
  describe '#func' do
44
44
  subject { described_class.new(:Trie) }
45
45
 
46
- it 'adds a constructor' do
46
+ it 'adds a func' do
47
47
  expect { subject.func(:empty) }
48
48
  .to change { subject.funcs.length }.by(1)
49
49
 
50
- subject.funcs.should be_all { |funcs|
51
- funcs.is_a?(Typist::Func)
50
+ expect(subject.funcs).to be_all { |func|
51
+ func.is_a?(Typist::Func)
52
+ }
53
+ end
54
+ end
55
+
56
+ describe '#data_func' do
57
+ subject { described_class.new(:SomeTree) }
58
+
59
+ it 'adds a data func' do
60
+ expect { subject.data_func(:test) { } }
61
+ .to change { subject.data_funcs.length }.by(1)
62
+
63
+ expect(subject.data_funcs).to be_all { |data_func|
64
+ data_func.is_a?(Typist::DataFunc)
52
65
  }
53
66
  end
54
67
  end
@@ -57,7 +70,7 @@ describe Typist::Data do
57
70
  subject { described_class.new(:Set) }
58
71
 
59
72
  it 'returns a module' do
60
- subject.get_module.should be_a(Module)
73
+ expect(subject.get_module).to be_a(Module)
61
74
  end
62
75
  end
63
76
 
@@ -67,6 +80,10 @@ describe Typist::Data do
67
80
  constructor :Leaf
68
81
  constructor :Node, :value, :left, :right
69
82
 
83
+ data_func :singleton do |value|
84
+ Tree.node(:value => value, :left => Tree.leaf, :right => Tree.leaf)
85
+ end
86
+
70
87
  func :empty? do
71
88
  match(Tree::Leaf) { true }
72
89
  match(Tree::Node) { false }
@@ -116,29 +133,34 @@ describe Typist::Data do
116
133
  }
117
134
 
118
135
  it 'defines convenience methods' do
119
- Tree.should respond_to(:node)
120
- Tree.should respond_to(:leaf)
136
+ expect(Tree).to respond_to(:node)
137
+ expect(Tree).to respond_to(:leaf)
121
138
  end
122
139
 
123
140
  it 'defines each constructor' do
124
- Tree::Node.should include(Tree)
125
- Tree::Leaf.should include(Tree)
141
+ expect(Tree::Node.ancestors).to include(Tree)
142
+ expect(Tree::Leaf.ancestors).to include(Tree)
143
+
144
+ expect(node.value).to eq(4)
145
+ expect(node.left).to eq(Tree.leaf)
146
+ expect(node.right).to eq(Tree.leaf)
147
+ end
126
148
 
127
- node.value.should == 4
128
- node.left.should == Tree.leaf
129
- node.right.should == Tree.leaf
149
+ it 'defines each data function' do
150
+ expect(Tree.singleton(1))
151
+ .to eq(Tree.node(:value => 1, :left => Tree.leaf, :right => Tree.leaf))
130
152
  end
131
153
 
132
154
  it 'defines functions on the constructors' do
133
- leaf.should be_empty
134
- node.should_not be_empty
155
+ expect(leaf).to be_empty
156
+ expect(node).to_not be_empty
135
157
 
136
- leaf.contains?(4).should be_false
137
- node.contains?(4).should be_true
138
- node.contains?(5).should be_false
158
+ expect(leaf.contains?(4)).to be_false
159
+ expect(node.contains?(4)).to be_true
160
+ expect(node.contains?(5)).to be_false
139
161
 
140
- leaf.size.should == 0
141
- node.size.should == 1
162
+ expect(leaf.size).to eq(0)
163
+ expect(node.size).to eq(1)
142
164
  end
143
165
  end
144
166
  end
@@ -6,11 +6,11 @@ describe Typist::Func do
6
6
  subject { described_class.new(:a_function) }
7
7
 
8
8
  it 'sets the @name instance variable to the first argument' do
9
- subject.name.should == :a_function
9
+ expect(subject.name).to eq(:a_function)
10
10
  end
11
11
 
12
12
  it 'has no matches intially' do
13
- subject.matches.should be_empty
13
+ expect(subject.matches).to be_empty
14
14
  end
15
15
  end
16
16
 
@@ -29,12 +29,11 @@ describe Typist::Func do
29
29
  before { subject.match(Fixnum) { :it_works } }
30
30
 
31
31
  it 'adds that to the @matches hash' do
32
- subject.matches[Fixnum].call.should == :it_works
32
+ expect(subject.matches[Fixnum].call).to eq(:it_works)
33
33
  end
34
34
  end
35
35
 
36
36
  describe '#define!' do
37
-
38
37
  context 'when an invalid class is matched against' do
39
38
  subject {
40
39
  module BaseModule; end
@@ -75,7 +74,7 @@ describe Typist::Func do
75
74
 
76
75
  context 'when a subclass does match against the function' do
77
76
  it 'evaluates its match' do
78
- Matches.new.alpha.should == 'qt3.14'
77
+ expect(Matches.new.alpha).to eq('qt3.14')
79
78
  end
80
79
  end
81
80
  end
@@ -13,7 +13,7 @@ describe Typist::Util do
13
13
  }
14
14
 
15
15
  it 'converts CamelCase Strings to snake_case' do
16
- hash.each { |camel, snake| subject.snakeify(camel).should == snake }
16
+ expect(hash).to be_all { |camel, snake| subject.snakeify(camel) == snake }
17
17
  end
18
18
  end
19
19
  end
@@ -1,8 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Typist do
4
- it { should be_a Module }
5
-
6
4
  describe '#data' do
7
5
  before do
8
6
  extend Typist
@@ -19,13 +17,13 @@ describe Typist do
19
17
  end
20
18
 
21
19
  it 'defines a data type' do
22
- Boolean.should be_a Module
20
+ expect(Boolean).to be_a(Module)
23
21
 
24
- Boolean.false.should be_a Boolean::False
25
- Boolean.true.should be_a Boolean::True
22
+ expect(Boolean.false).to be_a(Boolean::False)
23
+ expect(Boolean.true).to be_a(Boolean::True)
26
24
 
27
- Boolean.false.to_i.should == 0
28
- Boolean.true.to_i.should == 1
25
+ expect(Boolean.false.to_i).to eq(0)
26
+ expect(Boolean.true.to_i).to eq(1)
29
27
  end
30
28
  end
31
29
  end
@@ -1,5 +1,12 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
 
3
+ # Submit metrics to code climate.
4
+ unless ENV['CODECLIMATE_REPO_TOKEN'].nil?
5
+ require 'codeclimate-test-reporter'
6
+ CodeClimate::TestReporter.start
7
+ end
8
+
9
+ require 'pry'
3
10
  require 'rspec'
4
11
  require 'typist'
5
12
 
@@ -18,4 +18,5 @@ Gem::Specification.new do |gem|
18
18
  gem.add_development_dependency 'rspec'
19
19
  gem.add_development_dependency 'cane'
20
20
  gem.add_development_dependency 'pry'
21
+ gem.add_development_dependency 'codeclimate-test-reporter'
21
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Hulihan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-21 00:00:00.000000000 Z
11
+ date: 2014-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: codeclimate-test-reporter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Algebraic data types for Ruby
70
84
  email:
71
85
  - hulihan.tom159@gmail.com
@@ -81,11 +95,13 @@ files:
81
95
  - lib/typist.rb
82
96
  - lib/typist/constructor.rb
83
97
  - lib/typist/data.rb
98
+ - lib/typist/data_func.rb
84
99
  - lib/typist/error.rb
85
100
  - lib/typist/func.rb
86
101
  - lib/typist/util.rb
87
102
  - lib/typist/version.rb
88
103
  - spec/lib/typist/constructor_spec.rb
104
+ - spec/lib/typist/data_func_spec.rb
89
105
  - spec/lib/typist/data_spec.rb
90
106
  - spec/lib/typist/func_spec.rb
91
107
  - spec/lib/typist/util_spec.rb
@@ -118,6 +134,7 @@ specification_version: 4
118
134
  summary: Algebraic data types for Ruby
119
135
  test_files:
120
136
  - spec/lib/typist/constructor_spec.rb
137
+ - spec/lib/typist/data_func_spec.rb
121
138
  - spec/lib/typist/data_spec.rb
122
139
  - spec/lib/typist/func_spec.rb
123
140
  - spec/lib/typist/util_spec.rb