rubycube 0.2.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.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +30 -0
  3. data/MANIFEST +12 -0
  4. data/README.md +69 -0
  5. data/Rakefile +50 -0
  6. data/certs/djberg96_pub.pem +21 -0
  7. data/cube.gemspec +23 -0
  8. data/doc/Bar.html +102 -0
  9. data/doc/CHANGES.html +159 -0
  10. data/doc/Foo.html +184 -0
  11. data/doc/Interface.html +278 -0
  12. data/doc/Interface/MethodMissing.html +104 -0
  13. data/doc/Interface/PrivateVisibleMethodMissing.html +102 -0
  14. data/doc/Interface/PublicVisibleMethodMissing.html +102 -0
  15. data/doc/MANIFEST.html +114 -0
  16. data/doc/Module.html +153 -0
  17. data/doc/MyClass.html +234 -0
  18. data/doc/MyInterface.html +106 -0
  19. data/doc/MySubInterface.html +110 -0
  20. data/doc/Object.html +299 -0
  21. data/doc/README.html +222 -0
  22. data/doc/Rakefile.html +148 -0
  23. data/doc/TC_Interface.html +438 -0
  24. data/doc/certs/djberg96_pub_pem.html +110 -0
  25. data/doc/created.rid +13 -0
  26. data/doc/css/fonts.css +167 -0
  27. data/doc/css/rdoc.css +590 -0
  28. data/doc/fonts/Lato-Light.ttf +0 -0
  29. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  30. data/doc/fonts/Lato-Regular.ttf +0 -0
  31. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  32. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  33. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  34. data/doc/images/add.png +0 -0
  35. data/doc/images/arrow_up.png +0 -0
  36. data/doc/images/brick.png +0 -0
  37. data/doc/images/brick_link.png +0 -0
  38. data/doc/images/bug.png +0 -0
  39. data/doc/images/bullet_black.png +0 -0
  40. data/doc/images/bullet_toggle_minus.png +0 -0
  41. data/doc/images/bullet_toggle_plus.png +0 -0
  42. data/doc/images/date.png +0 -0
  43. data/doc/images/delete.png +0 -0
  44. data/doc/images/find.png +0 -0
  45. data/doc/images/loadingAnimation.gif +0 -0
  46. data/doc/images/macFFBgHack.png +0 -0
  47. data/doc/images/package.png +0 -0
  48. data/doc/images/page_green.png +0 -0
  49. data/doc/images/page_white_text.png +0 -0
  50. data/doc/images/page_white_width.png +0 -0
  51. data/doc/images/plugin.png +0 -0
  52. data/doc/images/ruby.png +0 -0
  53. data/doc/images/tag_blue.png +0 -0
  54. data/doc/images/tag_green.png +0 -0
  55. data/doc/images/transparent.png +0 -0
  56. data/doc/images/wrench.png +0 -0
  57. data/doc/images/wrench_orange.png +0 -0
  58. data/doc/images/zoom.png +0 -0
  59. data/doc/index.html +121 -0
  60. data/doc/interface_gemspec.html +121 -0
  61. data/doc/js/darkfish.js +161 -0
  62. data/doc/js/jquery.js +4 -0
  63. data/doc/js/navigation.js +142 -0
  64. data/doc/js/navigation.js.gz +0 -0
  65. data/doc/js/search.js +109 -0
  66. data/doc/js/search_index.js +1 -0
  67. data/doc/js/search_index.js.gz +0 -0
  68. data/doc/js/searcher.js +228 -0
  69. data/doc/js/searcher.js.gz +0 -0
  70. data/doc/table_of_contents.html +227 -0
  71. data/examples/demo.rb +96 -0
  72. data/lib/cube.rb +2 -0
  73. data/lib/cube/interfaces.rb +266 -0
  74. data/lib/cube/traits.rb +75 -0
  75. data/test/test_interface.rb +111 -0
  76. metadata +151 -0
@@ -0,0 +1,75 @@
1
+ require_relative 'interfaces'
2
+
3
+ module Cube
4
+ module Trait
5
+ class MethodConflict < RuntimeError; end
6
+ class IncludeError < RuntimeError; end
7
+
8
+ def requires_interface(intf)
9
+ unless intf.is_a? Cube::Interface
10
+ raise ArgumentError, "#{intf} is not a Cube::Interface"
11
+ end
12
+ @__interface_trait_required_interface = intf
13
+ end
14
+
15
+ def append_features(mod)
16
+ unless mod.instance_variable_defined?(:@__trait_allow_include) &&
17
+ mod.instance_variable_get(:@__trait_allow_include)
18
+ raise IncludeError, "Traits can only be mixed in using method `with_trait`"
19
+ end
20
+ conflicts = public_instance_methods & mod.public_instance_methods
21
+ errors = conflicts.map { |c|
22
+ meth = mod.instance_method(c)
23
+ { meth: meth, owner: meth.owner } unless meth.owner.is_a?(Class)
24
+ }.compact
25
+ unless errors.empty?
26
+ message = "\n" + errors.map { |e| e[:meth].to_s }.join("\n")
27
+ raise MethodConflict, message
28
+ end
29
+ if @__interface__trait_required_interface
30
+ intf = @__interface_trait_required_interface
31
+ mod.include?(intf) || mod.assert_implements(intf)
32
+ end
33
+ super(mod)
34
+ end
35
+ end
36
+ end
37
+
38
+ class Module
39
+ def with_trait(trait, aliases: {}, suppresses: [])
40
+ unless trait.is_a? Cube::Trait
41
+ raise ArgumentError, "#{trait} is not an Cube::Trait"
42
+ end
43
+ cls = clone
44
+ cls.instance_variable_set(:@__trait_allow_include, true)
45
+ cls.instance_variable_set(:@__trait_cloned_from, self)
46
+ raise ArgumentError, "aliases must be a Hash" unless aliases.is_a?(Hash)
47
+ raise ArgumentError, "supresses must be a Array" unless suppresses.is_a?(Array)
48
+
49
+ al_trait = trait_with_resolutions(trait, aliases, suppresses)
50
+ al_trait.instance_variable_set(:@__interface_runtime_check, false)
51
+ cls.include(al_trait)
52
+ cls
53
+ end
54
+
55
+ private
56
+
57
+ def trait_with_resolutions(trait, aliases, suppress)
58
+ cl = trait.clone
59
+ cl.module_exec do
60
+ suppress.each do |sup|
61
+ undef_method(sup)
62
+ end
63
+ aliases.each do |before, after|
64
+ begin
65
+ alias_method(after, before)
66
+ rescue => e
67
+ $stderr.puts "with_trait(#{trait}): #{e.message}"
68
+ raise ArgumentError, "with_trait(#{trait}): #{e.message}"
69
+ end
70
+ undef_method(before)
71
+ end
72
+ end
73
+ cl
74
+ end
75
+ end
@@ -0,0 +1,111 @@
1
+ #####################################################
2
+ # test_interface.rb
3
+ #
4
+ # Test suite for the Interface module.
5
+ #####################################################
6
+ ENV['RUBY_CUBE_TYPECHECK'] = "1"
7
+ require 'test-unit'
8
+ require 'cube'
9
+
10
+
11
+ class TC_Interface < Test::Unit::TestCase
12
+ def self.startup
13
+ alpha_interface = interface{
14
+ public_visible(:alpha, :beta)
15
+ proto(:beta) { [Integer, NilClass].to_set }
16
+ proto(:delta, Integer, String, Integer) { Integer }
17
+ }
18
+
19
+ gamma_interface = interface{
20
+ extends alpha_interface
21
+ public_visible :gamma
22
+ }
23
+
24
+ # Workaround for 1.9.x
25
+ @@alpha_interface = alpha_interface
26
+ @@gamma_interface = gamma_interface
27
+
28
+ eval("class A; end")
29
+
30
+ eval("
31
+ class B
32
+ def alpha; end
33
+ def beta; end
34
+ def delta(a, b, c=nil); 0; end
35
+ end
36
+ ")
37
+
38
+ eval("
39
+ class C
40
+ def alpha; end
41
+ def beta; end
42
+ def gamma; end
43
+ def delta(a); end
44
+ end
45
+ ")
46
+ end
47
+
48
+
49
+ def checker_method(arg)
50
+ check_type(@@gamma_interface, arg)
51
+ end
52
+
53
+ def test_version
54
+ assert_equal('0.2.0', Cube::Interface::VERSION)
55
+ end
56
+
57
+ def test_interface_requirements_not_met
58
+ assert_raise(Cube::Interface::PublicVisibleMethodMissing){ A.extend(@@alpha_interface) }
59
+ assert_raise(Cube::Interface::PublicVisibleMethodMissing){ A.new.extend(@@alpha_interface) }
60
+ end
61
+
62
+ def test_sub_interface_requirements_not_met
63
+ assert_raise(Cube::Interface::PublicVisibleMethodMissing){ B.extend(@@gamma_interface) }
64
+ assert_raise(Cube::Interface::PublicVisibleMethodMissing){ B.new.extend(@@gamma_interface) }
65
+ end
66
+
67
+ def test_alpha_interface_requirements_met
68
+ assert_nothing_raised{ B.new.extend(@@alpha_interface) }
69
+ end
70
+
71
+ def test_gamma_interface_requirements_met
72
+ assert_raise(Cube::Interface::MethodArityError) { C.new.extend(@@gamma_interface) }
73
+ assert_raise(Cube::Interface::MethodArityError) { C.as_interface(@@gamma_interface) }
74
+ end
75
+
76
+ def test_method_check
77
+ assert_raise(Cube::Interface::TypeMismatchError) { checker_method(B.as_interface(@@alpha_interface).new) }
78
+ end
79
+
80
+ def test_runtime_error_check
81
+ assert_nothing_raised {
82
+ B.as_interface(@@alpha_interface, runtime_checks: true).new.beta
83
+ }
84
+ assert_raise(ArgumentError) {
85
+ B.as_interface(@@alpha_interface).new.delta
86
+ }
87
+ assert_raise(ArgumentError) {
88
+ B.as_interface(@@alpha_interface).new.delta(1)
89
+ }
90
+ assert_raise(Cube::Interface::TypeMismatchError) {
91
+ B.as_interface(@@alpha_interface).new.delta(1, 2)
92
+ }
93
+ assert_raise(Cube::Interface::TypeMismatchError) {
94
+ B.as_interface(@@alpha_interface).new.delta(1, "2", "3")
95
+ }
96
+ assert_nothing_raised {
97
+ B.as_interface(@@alpha_interface).new.delta(1, "2")
98
+ }
99
+ assert_nothing_raised {
100
+ B.as_interface(@@alpha_interface).new.delta(1, "2", 3)
101
+ }
102
+ end
103
+
104
+ def test_shell
105
+ sh = @@alpha_interface.shell
106
+ sho = sh.new
107
+ [:alpha, :beta].each do |m|
108
+ assert_equal(sho.send(m), nil)
109
+ end
110
+ end
111
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubycube
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Aditya Godbole
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - certs/djberg96_pub.pem
12
+ date: 2016-07-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: test-unit
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
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: rake
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'
42
+ description: |2
43
+ CUBE (Composable Units of Behaviour) implements Interfaces, Traits and typechecks for Ruby.
44
+ email: code.aa@gdbl.me
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files:
48
+ - README.md
49
+ - CHANGES
50
+ - MANIFEST
51
+ files:
52
+ - CHANGES
53
+ - MANIFEST
54
+ - README.md
55
+ - Rakefile
56
+ - certs/djberg96_pub.pem
57
+ - cube.gemspec
58
+ - doc/Bar.html
59
+ - doc/CHANGES.html
60
+ - doc/Foo.html
61
+ - doc/Interface.html
62
+ - doc/Interface/MethodMissing.html
63
+ - doc/Interface/PrivateVisibleMethodMissing.html
64
+ - doc/Interface/PublicVisibleMethodMissing.html
65
+ - doc/MANIFEST.html
66
+ - doc/Module.html
67
+ - doc/MyClass.html
68
+ - doc/MyInterface.html
69
+ - doc/MySubInterface.html
70
+ - doc/Object.html
71
+ - doc/README.html
72
+ - doc/Rakefile.html
73
+ - doc/TC_Interface.html
74
+ - doc/certs/djberg96_pub_pem.html
75
+ - doc/created.rid
76
+ - doc/css/fonts.css
77
+ - doc/css/rdoc.css
78
+ - doc/fonts/Lato-Light.ttf
79
+ - doc/fonts/Lato-LightItalic.ttf
80
+ - doc/fonts/Lato-Regular.ttf
81
+ - doc/fonts/Lato-RegularItalic.ttf
82
+ - doc/fonts/SourceCodePro-Bold.ttf
83
+ - doc/fonts/SourceCodePro-Regular.ttf
84
+ - doc/images/add.png
85
+ - doc/images/arrow_up.png
86
+ - doc/images/brick.png
87
+ - doc/images/brick_link.png
88
+ - doc/images/bug.png
89
+ - doc/images/bullet_black.png
90
+ - doc/images/bullet_toggle_minus.png
91
+ - doc/images/bullet_toggle_plus.png
92
+ - doc/images/date.png
93
+ - doc/images/delete.png
94
+ - doc/images/find.png
95
+ - doc/images/loadingAnimation.gif
96
+ - doc/images/macFFBgHack.png
97
+ - doc/images/package.png
98
+ - doc/images/page_green.png
99
+ - doc/images/page_white_text.png
100
+ - doc/images/page_white_width.png
101
+ - doc/images/plugin.png
102
+ - doc/images/ruby.png
103
+ - doc/images/tag_blue.png
104
+ - doc/images/tag_green.png
105
+ - doc/images/transparent.png
106
+ - doc/images/wrench.png
107
+ - doc/images/wrench_orange.png
108
+ - doc/images/zoom.png
109
+ - doc/index.html
110
+ - doc/interface_gemspec.html
111
+ - doc/js/darkfish.js
112
+ - doc/js/jquery.js
113
+ - doc/js/navigation.js
114
+ - doc/js/navigation.js.gz
115
+ - doc/js/search.js
116
+ - doc/js/search_index.js
117
+ - doc/js/search_index.js.gz
118
+ - doc/js/searcher.js
119
+ - doc/js/searcher.js.gz
120
+ - doc/table_of_contents.html
121
+ - examples/demo.rb
122
+ - lib/cube.rb
123
+ - lib/cube/interfaces.rb
124
+ - lib/cube/traits.rb
125
+ - test/test_interface.rb
126
+ homepage: http://github.com/adityagodbole/rubycube
127
+ licenses:
128
+ - Artistic 2.0
129
+ metadata: {}
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubyforge_project:
146
+ rubygems_version: 2.4.5
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: Interfaces for Ruby
150
+ test_files:
151
+ - test/test_interface.rb