rubycube 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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