rubycube 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/cube.gemspec +3 -1
  3. data/examples/demo.rb +13 -8
  4. data/examples/traits.rb +26 -10
  5. data/lib/cube/interfaces.rb +11 -45
  6. data/lib/cube/toplevel.rb +28 -39
  7. data/lib/cube/traits.rb +0 -32
  8. data/rubycube-0.3.0.gem +0 -0
  9. data/test/test_interface.rb +9 -5
  10. metadata +34 -68
  11. data/doc/Bar.html +0 -102
  12. data/doc/CHANGES.html +0 -159
  13. data/doc/Foo.html +0 -184
  14. data/doc/Interface.html +0 -278
  15. data/doc/Interface/MethodMissing.html +0 -104
  16. data/doc/Interface/PrivateVisibleMethodMissing.html +0 -102
  17. data/doc/Interface/PublicVisibleMethodMissing.html +0 -102
  18. data/doc/MANIFEST.html +0 -114
  19. data/doc/Module.html +0 -153
  20. data/doc/MyClass.html +0 -234
  21. data/doc/MyInterface.html +0 -106
  22. data/doc/MySubInterface.html +0 -110
  23. data/doc/Object.html +0 -299
  24. data/doc/README.html +0 -222
  25. data/doc/Rakefile.html +0 -148
  26. data/doc/TC_Interface.html +0 -438
  27. data/doc/certs/djberg96_pub_pem.html +0 -110
  28. data/doc/created.rid +0 -13
  29. data/doc/css/fonts.css +0 -167
  30. data/doc/css/rdoc.css +0 -590
  31. data/doc/fonts/Lato-Light.ttf +0 -0
  32. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  33. data/doc/fonts/Lato-Regular.ttf +0 -0
  34. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  35. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  36. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  37. data/doc/images/add.png +0 -0
  38. data/doc/images/arrow_up.png +0 -0
  39. data/doc/images/brick.png +0 -0
  40. data/doc/images/brick_link.png +0 -0
  41. data/doc/images/bug.png +0 -0
  42. data/doc/images/bullet_black.png +0 -0
  43. data/doc/images/bullet_toggle_minus.png +0 -0
  44. data/doc/images/bullet_toggle_plus.png +0 -0
  45. data/doc/images/date.png +0 -0
  46. data/doc/images/delete.png +0 -0
  47. data/doc/images/find.png +0 -0
  48. data/doc/images/loadingAnimation.gif +0 -0
  49. data/doc/images/macFFBgHack.png +0 -0
  50. data/doc/images/package.png +0 -0
  51. data/doc/images/page_green.png +0 -0
  52. data/doc/images/page_white_text.png +0 -0
  53. data/doc/images/page_white_width.png +0 -0
  54. data/doc/images/plugin.png +0 -0
  55. data/doc/images/ruby.png +0 -0
  56. data/doc/images/tag_blue.png +0 -0
  57. data/doc/images/tag_green.png +0 -0
  58. data/doc/images/transparent.png +0 -0
  59. data/doc/images/wrench.png +0 -0
  60. data/doc/images/wrench_orange.png +0 -0
  61. data/doc/images/zoom.png +0 -0
  62. data/doc/index.html +0 -121
  63. data/doc/interface_gemspec.html +0 -121
  64. data/doc/js/darkfish.js +0 -161
  65. data/doc/js/jquery.js +0 -4
  66. data/doc/js/navigation.js +0 -142
  67. data/doc/js/navigation.js.gz +0 -0
  68. data/doc/js/search.js +0 -109
  69. data/doc/js/search_index.js +0 -1
  70. data/doc/js/search_index.js.gz +0 -0
  71. data/doc/js/searcher.js +0 -228
  72. data/doc/js/searcher.js.gz +0 -0
  73. data/doc/table_of_contents.html +0 -227
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a67b0c4bfcd1f828f6f2c976dfacb893fd3447d
4
- data.tar.gz: 2185c04360ba16d024ba0e3c4369cb27fd6ea75a
3
+ metadata.gz: 2bcabba8c4d9c0e4e97fbe87c677b5a4f6cb12de
4
+ data.tar.gz: b41bb0dde4bf03c019bbe008242b9a56ed51043a
5
5
  SHA512:
6
- metadata.gz: 54329a70c088a60cefb0dbb060274fa4a3ef0619d2c0363bd08032d3927d0735238e319789049850f45f174f8194d312db0aea409bd02fb8b29de0a9479c655f
7
- data.tar.gz: 7dad8733970a4a3734a55e37d3a34762112643a6f54ab7094098884d90cc5346fa1e41d00217e5990768b90df0326842ec699f9c548bae113ab4972ba33da723
6
+ metadata.gz: c24794642ae6e1ee65a52184b3e60efdfb243571307afaa2dc442c4d413171a13e0bce27bd16e130846b1718d794f668a6c184db0896aaadabbaa1bbe6f9adbb
7
+ data.tar.gz: '0283893f2805db378c55358ceaa15e370ab13519f7d40aa3e788b33ae430b42e4285e5acf0dfb4665054fc7e1940d1776580de3a5ac6e6b8f8c0372e7ef8d62e'
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'rubycube'
5
- spec.version = '0.3.1'
5
+ spec.version = '0.4.0'
6
6
  spec.author = 'Aditya Godbole'
7
7
  spec.license = 'Artistic 2.0'
8
8
  spec.email = 'code.aa@gdbl.me'
@@ -15,6 +15,8 @@ Gem::Specification.new do |spec|
15
15
 
16
16
  spec.extra_rdoc_files = ['README.md', 'CHANGES', 'MANIFEST', 'examples/demo.rb']
17
17
 
18
+ spec.add_dependency('dry-types')
19
+ spec.add_development_dependency('dry-types')
18
20
  spec.add_development_dependency('test-unit')
19
21
  spec.add_development_dependency('rake')
20
22
 
@@ -1,19 +1,24 @@
1
1
  # run as `RUBY_CUBE_TYPECHECK= 1 ruby examples/demo.rb`
2
2
  #require_relative '../lib/cube'
3
3
  require 'cube'
4
+ require 'dry-types'
5
+
6
+ module Types
7
+ include Dry::Types.module
8
+ end
4
9
 
5
10
  Adder = Cube.interface {
6
- # sum is a method that takes an array of Integer and returns an Integer
7
- proto(:sum, [Integer]) { Integer }
11
+ # sum is a method that takes an array of Types::Strict::Int and returns an Types::Strict::Int
12
+ proto(:sum, [Types::Strict::Int]) { Types::Strict::Int }
8
13
  }
9
14
 
10
15
  Calculator = Cube.interface {
11
16
  # interfaces can be composed
12
17
  extends Adder
13
- # method fact takes an Integer and returns an Integer
14
- proto(:fact, Integer) { Integer }
15
- # method pos takes an array of Integers, an Integer, and returns either Integer or nil
16
- proto(:pos, [Integer], Integer) { [Integer, NilClass].to_set }
18
+ # method fact takes an Types::Strict::Int and returns an Types::Strict::Int
19
+ proto(:fact, Types::Strict::Int) { Types::Strict::Int }
20
+ # method pos takes an array of Types::Strict::Ints, an Types::Strict::Int, and returns either Types::Strict::Int or nil
21
+ proto(:pos, [Types::Strict::Array], Types::Strict::Int) { Types::Strict::Int|Types::Strict::Nil }
17
22
  }
18
23
 
19
24
  class SimpleCalcImpl
@@ -39,8 +44,8 @@ p c.pos([1, 2, 3], 4)
39
44
 
40
45
  AdvancedCalculator = Cube.interface {
41
46
  extend Calculator
42
- proto(:product, Integer, Integer) { Integer }
43
- proto(:avg, [Integer]) { Float }
47
+ proto(:product, Types::Strict::Int, Types::Strict::Int) { Types::Strict::Int }
48
+ proto(:avg, [Types::Strict::Int]) { Types::Strict::Float }
44
49
  }
45
50
 
46
51
  ProductCalcT = Cube.trait do
@@ -1,12 +1,18 @@
1
1
  ENV['RUBY_CUBE_TYPECHECK'] = "1"
2
2
  #require_relative '../lib/cube'
3
3
  require 'cube'
4
+ require 'dry-initializer'
5
+
6
+ module Types
7
+ include Dry::Types.module
8
+ end
9
+
4
10
  EmailNotifierT = Cube.trait do
5
11
  def notify
6
12
  puts "email sent to #{email}"
7
13
  end
8
14
  requires_interface Cube.interface {
9
- proto(:email) { String }
15
+ proto(:email) { Types::Strict::String }
10
16
  }
11
17
  end
12
18
 
@@ -16,7 +22,7 @@ AndroidNotifierT = Cube.trait do
16
22
  end
17
23
 
18
24
  requires_interface Cube.interface {
19
- proto(:mobile_number) { String }
25
+ proto(:mobile_number) { Types::Strict::String }
20
26
  }
21
27
  end
22
28
 
@@ -26,7 +32,7 @@ IOSNotifierT = Cube.trait do
26
32
  end
27
33
 
28
34
  requires_interface Cube.interface {
29
- proto(:mobile_number) { String }
35
+ proto(:mobile_number) { Types::Strict::String }
30
36
  }
31
37
  end
32
38
 
@@ -50,21 +56,31 @@ IOSCombinedNotifier = Cube.trait.with_trait(IOSNotifierT, rename: { notify: :mob
50
56
  .with_trait(CombinedNotifierT)
51
57
 
52
58
  MobileEmailUser = Cube.interface {
53
- proto(:email) { String }
54
- proto(:mobile_number) { String }
59
+ proto(:email) { Types::Strict::String }
60
+ proto(:mobile_number) { Types::Strict::String }
55
61
  }
56
62
 
63
+ class Service
64
+ extend Dry::Initializer
65
+ option :email
66
+ option :mobile_number
67
+ option :type
68
+ end
69
+
70
+ AndroidService = Cube[Service].with_trait(AndroidCombinedNotifier)
71
+ .as_interface(MobileEmailUser)
72
+ IOSService = Cube[Service].with_trait(IOSCombinedNotifier)
73
+ .as_interface(MobileEmailUser)
74
+
57
75
  Services = {
58
- android: AndroidCombinedNotifier.wrap(MobileEmailUser),
59
- ios: IOSCombinedNotifier.wrap(MobileEmailUser)
76
+ android: AndroidService,
77
+ ios: IOSService
60
78
  }
61
79
  User = Struct.new(:email, :mobile_number, :type)
62
- Cube.mark_interface!(User, MobileEmailUser)
63
- CubeUser = Cube[User].as_interface(MobileEmailUser)
64
80
 
65
81
  u1 = User.new('u1@foo.com', '1234567890', :android)
66
82
  u2 = User.new('u2@foo.com', '1234567899', :ios)
67
83
 
68
84
  [u1, u2].each do |u|
69
- Services[u.type].new(u).notify
85
+ Services[u.type].new(u.to_h).notify
70
86
  end
@@ -1,5 +1,6 @@
1
1
  require 'securerandom'
2
2
  require 'set'
3
+ require 'dry-types'
3
4
  # A module for implementing Java style interfaces in Ruby. For more information
4
5
  # about Java interfaces, please see:
5
6
  #
@@ -9,28 +10,6 @@ require 'set'
9
10
  # Top level module for RubyCube
10
11
  module Cube
11
12
  module Interface
12
-
13
- def self.match_specs(i1specs, i2specs)
14
- i1specs.each do |meth, i1spec|
15
- i2spec = i2specs[meth]
16
- raise InterfaceMatchError, "Method `#{meth}` not found" unless i2spec
17
- i2_in = i2spec[:in]
18
- i1_in = i1spec[:in]
19
- if i1_in && (!i2_in || i1_in.size != i2_in.size)
20
- raise InterfaceMatchError, "Method `#{meth}` prototype does not match"
21
- end
22
- (i1_in || []).each_index do |i|
23
- Cube.check_type_spec(i1_in[i], i2_in[i]) { |t1, t2| t2 == t1 }
24
- end
25
- i1_out = i1spec[:out]
26
- if i1_out
27
- i2_out = i2spec[:out]
28
- raise InterfaceMatchError, "Method `#{meth}` prototype does not match" unless i2_out
29
- Cube.check_type_spec(i1_out, i2_out) { |t1, t2| t2 == t1 }
30
- end
31
- end
32
- end
33
-
34
13
  # Exceptions thrown while checking interfaces
35
14
  class MethodMissing < RuntimeError; end
36
15
  class PrivateVisibleMethodMissing < MethodMissing; end
@@ -131,28 +110,26 @@ module Cube
131
110
  # replace method with a type checking wrapper
132
111
  mod.class_exec do
133
112
  # random alias name to avoid conflicts
134
- ns_meth_name = "#{id}_#{SecureRandom.hex(3)}".to_sym
113
+ ns_meth_name = "#{id}_#{SecureRandom.hex(3)}".to_sym
135
114
  alias_method ns_meth_name, id
136
115
  # The type checking wrapper
137
116
  define_method(id) do |*args|
138
- args.each_index do |i|
139
- # the value and expected type of the arg
140
- v, t = args[i], inchecks[i]
117
+ new_args = args.zip(inchecks).map do |v, t|
141
118
  begin
142
- Cube.check_type(t, v)
143
- rescue Interface::TypeMismatchError => e
119
+ Cube.check_type(t,v)
120
+ rescue Dry::Types::ConstraintError => e
144
121
  raise Interface::TypeMismatchError,
145
- "#{mod}: #{iface}##{id} (arg: #{i}): #{e.message}"
122
+ "#{mod}: #{iface}##{id} : #{e.message}"
146
123
  end
147
124
  end
148
125
  # types look good, call the original method
149
- ret = send(ns_meth_name, *args)
126
+ ret = send(ns_meth_name, *new_args)
150
127
  # check return type if it exists
151
128
  begin
152
129
  Cube.check_type(outcheck, ret) if outcheck
153
- rescue Interface::TypeMismatchError => e
130
+ rescue Dry::Types::ConstraintError => e
154
131
  raise Interface::TypeMismatchError,
155
- "#{mod}: #{iface}##{id} (return): #{e.message}"
132
+ "#{mod}: #{iface}##{id} (return): #{e.message}"
156
133
  end
157
134
  # looks good, return
158
135
  ret
@@ -174,12 +151,8 @@ module Cube
174
151
  # validate the interface spec is valid
175
152
  def validate_spec(spec)
176
153
  [*spec].each do |t|
177
- if t.is_a?(Array)
178
- unless t.first.is_a?(Module)
179
- raise ArgumentError, "#{t} does not contain a Module or Interface"
180
- end
181
- elsif !t.is_a?(Module)
182
- raise ArgumentError, "#{t} is not a Module or Interface"
154
+ unless t.is_a?(Dry::Types::Type) || t.is_a?(Module)
155
+ raise ArgumentError, "#{t} is not a Dry::Types::Type nor a Module"
183
156
  end
184
157
  end
185
158
  end
@@ -203,13 +176,6 @@ module Cube
203
176
  @ids.merge(inherited_specs)
204
177
  end
205
178
 
206
- def assert_match(intf)
207
- raise ArgumentError, "#{intf} is not a Cube::Interface" unless intf.is_a?(Interface)
208
- intf_specs = intf.to_spec
209
- self_specs = to_spec
210
- Interface.match_specs(self_specs, intf_specs)
211
- end
212
-
213
179
  def proto(meth, *args)
214
180
  out_spec = yield if block_given?
215
181
  validate_spec(args)
@@ -1,3 +1,5 @@
1
+ require 'dry-types'
2
+
1
3
  module Cube
2
4
  def self.mark_interface!(cls, iface)
3
5
  Cube[cls].as_interface(iface, runtime_checks: false)
@@ -36,49 +38,36 @@ module Cube
36
38
  m
37
39
  end
38
40
 
39
- def self.check_type_spec(t, v, &blk)
40
- if t.is_a?(Set)
41
- if v.is_a?(Set)
42
- if v != t
43
- raise Cube::Interface::TypeMismatchError, "#{t.to_a} is not eql to #{v.to_a}"
44
- end
45
- return true
46
- end
47
- unless t.any? { |tp| check_type(tp, v, &blk) rescue false }
48
- raise Cube::Interface::TypeMismatchError,
49
- "#{v.inspect} is not any of #{t.to_a}"
50
- end
51
- return
52
- end
53
- if t.is_a? Array
54
- raise Cube::Interface::TypeMismatchError,
55
- "#{v} is not an Array" unless v.is_a? Array
56
- check_type(t.first, v.first, &blk)
57
- check_type(t.first, v.last, &blk)
58
- return
59
- end
60
- raise Cube::Interface::TypeMismatchError, "#{v.inspect} is not type #{t}" unless blk.call(t, v)
61
- true
62
- end
41
+ # def self.check_type_spec(t, v, &blk)
42
+ # if t.is_a?(Set)
43
+ # if v.is_a?(Set)
44
+ # if v != t
45
+ # raise Cube::Interface::TypeMismatchError, "#{t.to_a} is not eql to #{v.to_a}"
46
+ # end
47
+ # return true
48
+ # end
49
+ # unless t.any? { |tp| check_type(tp, v, &blk) rescue false }
50
+ # raise Cube::Interface::TypeMismatchError,
51
+ # "#{v.inspect} is not any of #{t.to_a}"
52
+ # end
53
+ # return
54
+ # end
55
+ # if t.is_a? Array
56
+ # raise Cube::Interface::TypeMismatchError,
57
+ # "#{v} is not an Array" unless v.is_a? Array
58
+ # check_type(t.first, v.first, &blk)
59
+ # check_type(t.first, v.last, &blk)
60
+ # return
61
+ # end
62
+ # raise Cube::Interface::TypeMismatchError, "#{v.inspect} is not type #{t}" unless blk.call(t, v)
63
+ # true
64
+ # end
63
65
 
64
66
  if ENV['RUBY_CUBE_TYPECHECK'].to_i > 0
65
67
  def self.check_type(t, v)
66
- if t.is_a?(Set)
67
- unless t.any? { |tp| check_type(tp, v) rescue false }
68
- raise Cube::Interface::TypeMismatchError,
69
- "#{v.inspect} is not any of #{t.to_a}"
70
- end
71
- return
72
- end
73
- if t.is_a? Array
74
- raise Cube::Interface::TypeMismatchError,
75
- "#{v} is not an Array" unless v.is_a? Array
76
- check_type(t.first, v.first)
77
- check_type(t.first, v.last)
78
- return
79
- end
68
+ return t[v] if t.is_a? Dry::Types::Type
80
69
  raise Cube::Interface::TypeMismatchError, "#{v.inspect} is not type #{t}" unless v.is_a? t
81
- true
70
+ v
82
71
  end
83
72
  else
84
73
  def self.check_type(*_); end
@@ -43,38 +43,6 @@ module Cube
43
43
  end
44
44
  super
45
45
  end
46
-
47
- def wrap(intf)
48
- assert_match(intf)
49
- cls = Class.new(SimpleDelegator) do
50
- define_method(:initialize) do |obj|
51
- $stderr.puts "Checking with #{intf}"
52
- Cube.check_type(intf, obj)
53
- super(obj)
54
- end
55
- end
56
- inc_trait = clone
57
- inc_trait.instance_variable_set(:@__interface_trait_required_interface, nil)
58
- inc_trait.instance_variable_set(:@__trait_cloned_from, self)
59
- Cube[cls].with_trait(inc_trait)
60
- end
61
-
62
- def assert_match(intf)
63
- self_methods = instance_methods
64
- inherited = self.ancestors.select{ |x| Trait === x }
65
- required_interface_spec = inherited.inject({}) { |acc, x|
66
- req = x.instance_variable_get('@__interface_trait_required_interface')
67
- if req
68
- acc.merge(req.to_spec)
69
- else
70
- acc
71
- end
72
- }
73
- self_methods.each do |sm|
74
- required_interface_spec.delete(sm)
75
- end
76
- Interface.match_specs(required_interface_spec, intf.to_spec)
77
- end
78
46
  end
79
47
  end
80
48
 
Binary file
@@ -5,15 +5,19 @@
5
5
  #####################################################
6
6
  ENV['RUBY_CUBE_TYPECHECK'] = "1"
7
7
  require 'test-unit'
8
- require 'cube'
8
+ require_relative '../lib/cube'
9
+ require 'dry-types'
9
10
 
11
+ module Types
12
+ include Dry::Types.module
13
+ end
10
14
 
11
15
  class TC_Interface < Test::Unit::TestCase
12
16
  def self.startup
13
17
  alpha_interface = Cube.interface{
14
18
  public_visible(:alpha, :beta)
15
- proto(:beta) { [Integer, NilClass].to_set }
16
- proto(:delta, Integer, String, Integer) { Integer }
19
+ proto(:beta) { Types::Strict::Int|Types::Strict::Nil }
20
+ proto(:delta, Types::Strict::Int, Types::Strict::String, Types::Strict::Int) { Types::Strict::Int }
17
21
  }
18
22
 
19
23
  gamma_interface = Cube.interface{
@@ -84,9 +88,9 @@ class TC_Interface < Test::Unit::TestCase
84
88
  assert_nothing_raised {
85
89
  Cube[B].as_interface(@@alpha_interface).as_interface(@@alpha_interface)
86
90
  }
87
- assert_nothing_raised {
91
+ # assert_nothing_raised {
88
92
  Cube[B].as_interface(@@alpha_interface, runtime_checks: true).new.beta
89
- }
93
+ # }
90
94
  assert_raise(ArgumentError) {
91
95
  Cube[B].as_interface(@@alpha_interface).new.delta
92
96
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubycube
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aditya Godbole
@@ -9,8 +9,36 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - certs/djberg96_pub.pem
12
- date: 2016-11-04 00:00:00.000000000 Z
12
+ date: 2018-03-18 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: dry-types
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: dry-types
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
14
42
  - !ruby/object:Gem::Dependency
15
43
  name: test-unit
16
44
  requirement: !ruby/object:Gem::Requirement
@@ -39,8 +67,8 @@ dependencies:
39
67
  - - ">="
40
68
  - !ruby/object:Gem::Version
41
69
  version: '0'
42
- description: |2
43
- CUBE (Composable Units of Behaviour) implements Interfaces, Traits and typechecks for Ruby.
70
+ description: " CUBE (Composable Units of Behaviour) implements Interfaces, Traits
71
+ and typechecks for Ruby.\n"
44
72
  email: code.aa@gdbl.me
45
73
  executables: []
46
74
  extensions: []
@@ -56,75 +84,13 @@ files:
56
84
  - Rakefile
57
85
  - certs/djberg96_pub.pem
58
86
  - cube.gemspec
59
- - doc/Bar.html
60
- - doc/CHANGES.html
61
- - doc/Foo.html
62
- - doc/Interface.html
63
- - doc/Interface/MethodMissing.html
64
- - doc/Interface/PrivateVisibleMethodMissing.html
65
- - doc/Interface/PublicVisibleMethodMissing.html
66
- - doc/MANIFEST.html
67
- - doc/Module.html
68
- - doc/MyClass.html
69
- - doc/MyInterface.html
70
- - doc/MySubInterface.html
71
- - doc/Object.html
72
- - doc/README.html
73
- - doc/Rakefile.html
74
- - doc/TC_Interface.html
75
- - doc/certs/djberg96_pub_pem.html
76
- - doc/created.rid
77
- - doc/css/fonts.css
78
- - doc/css/rdoc.css
79
- - doc/fonts/Lato-Light.ttf
80
- - doc/fonts/Lato-LightItalic.ttf
81
- - doc/fonts/Lato-Regular.ttf
82
- - doc/fonts/Lato-RegularItalic.ttf
83
- - doc/fonts/SourceCodePro-Bold.ttf
84
- - doc/fonts/SourceCodePro-Regular.ttf
85
- - doc/images/add.png
86
- - doc/images/arrow_up.png
87
- - doc/images/brick.png
88
- - doc/images/brick_link.png
89
- - doc/images/bug.png
90
- - doc/images/bullet_black.png
91
- - doc/images/bullet_toggle_minus.png
92
- - doc/images/bullet_toggle_plus.png
93
- - doc/images/date.png
94
- - doc/images/delete.png
95
- - doc/images/find.png
96
- - doc/images/loadingAnimation.gif
97
- - doc/images/macFFBgHack.png
98
- - doc/images/package.png
99
- - doc/images/page_green.png
100
- - doc/images/page_white_text.png
101
- - doc/images/page_white_width.png
102
- - doc/images/plugin.png
103
- - doc/images/ruby.png
104
- - doc/images/tag_blue.png
105
- - doc/images/tag_green.png
106
- - doc/images/transparent.png
107
- - doc/images/wrench.png
108
- - doc/images/wrench_orange.png
109
- - doc/images/zoom.png
110
- - doc/index.html
111
- - doc/interface_gemspec.html
112
- - doc/js/darkfish.js
113
- - doc/js/jquery.js
114
- - doc/js/navigation.js
115
- - doc/js/navigation.js.gz
116
- - doc/js/search.js
117
- - doc/js/search_index.js
118
- - doc/js/search_index.js.gz
119
- - doc/js/searcher.js
120
- - doc/js/searcher.js.gz
121
- - doc/table_of_contents.html
122
87
  - examples/demo.rb
123
88
  - examples/traits.rb
124
89
  - lib/cube.rb
125
90
  - lib/cube/interfaces.rb
126
91
  - lib/cube/toplevel.rb
127
92
  - lib/cube/traits.rb
93
+ - rubycube-0.3.0.gem
128
94
  - test/test_interface.rb
129
95
  homepage: http://github.com/adityagodbole/rubycube
130
96
  licenses:
@@ -146,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
112
  version: '0'
147
113
  requirements: []
148
114
  rubyforge_project:
149
- rubygems_version: 2.4.5
115
+ rubygems_version: 2.5.2.2
150
116
  signing_key:
151
117
  specification_version: 4
152
118
  summary: Interfaces for Ruby