Skip to content

Commit 0e1012d

Browse files
authored
Add ex04-myattr to ruby module with my_attr_reader part (#7)
1 parent a288a07 commit 0e1012d

File tree

8 files changed

+163
-3
lines changed

8 files changed

+163
-3
lines changed

courses/ruby/README.md

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,31 @@ ruby basics understanding.
2929
Don't forget to install dependencies with bundler `bundle install` before
3030
starting to work on tasks.
3131

32-
List of exercises:
32+
#### List of exercises:
3333

3434
- [ex01-enumerables](./ex01-enumerables)
3535
- [ex02-strings](./ex02-strings)
36+
- [ex03-wallet](./ex03-wallet)
3637

37-
38-
Resources:
38+
##### Resources:
3939

4040
- [Enumerable](https://ruby-doc.org/core-2.6.3/Enumerable.html)
4141
- [String](https://ruby-doc.org/core-2.4.0/String.html)
42+
43+
## Just metaprogram it
44+
45+
This section was designed for understanding basics of one of the most impressive
46+
aspect of ruby language. Metaprogramming is the writing of computer programs
47+
that write or manipulate other programs (or themselves) as their data, or that
48+
do part of the work at compile time that would otherwise be done at runtime.
49+
50+
#### List of exercises:
51+
52+
- [ex04-myattr](./ex04-myattr)
53+
54+
##### Resources:
55+
56+
- [Don't Know Metaprogramming In Ruby?](http://rubylearning.com/blog/2010/11/23/dont-know-metaprogramming-in-ruby/#what-is-metaprogramming:18bee3e64eb657db6a08ae0ff05e44b8)
57+
- [How to Use attr_accessor, attr_writer & attr_reader](https://www.rubyguides.com/2018/11/attr_accessor/)
58+
- [Include vs Prepend vs Extend](https://medium.com/@leo_hetsch/ruby-modules-include-vs-prepend-vs-extend-f09837a5b073)
59+
- [Module define_method](https://apidock.com/ruby/Module/define_method)

courses/ruby/ex04-myattr/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
The goal of this exercise is to make first steps in ruby metaprogramming and
2+
understand how `attr_reader`, `attr_writer` and `attr_accessor` works.
3+
4+
Do tasks in the next sequence:
5+
- my_attr_reader_test.rb
6+
- my_attr_writer_test.rb
7+
- my_attr_accessor_test.rb
8+
9+
## Resources
10+
11+
Read the next list of resources carefully before starting this task:
12+
13+
- [Don't Know Metaprogramming In Ruby?](http://rubylearning.com/blog/2010/11/23/dont-know-metaprogramming-in-ruby/#what-is-metaprogramming:18bee3e64eb657db6a08ae0ff05e44b8)
14+
- [How to Use attr_accessor, attr_writer & attr_reader](https://www.rubyguides.com/2018/11/attr_accessor/)
15+
- [Include vs Prepend vs Extend](https://medium.com/@leo_hetsch/ruby-modules-include-vs-prepend-vs-extend-f09837a5b073)
16+
- [Module define_method](https://apidock.com/ruby/Module/define_method)
17+
18+
## TODO: Add Running test suite & rubocop sections.

courses/ruby/ex04-myattr/my_attr_accessor.rb

Whitespace-only changes.

courses/ruby/ex04-myattr/my_attr_accessor_test.rb

Whitespace-only changes.

courses/ruby/ex04-myattr/my_attr_reader.rb

Whitespace-only changes.
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
require "minitest/autorun"
2+
require "minitest/pride"
3+
4+
require_relative "my_attr_reader"
5+
6+
class MyAttrReaderTest < Minitest::Test
7+
def test_single_my_attr_reader
8+
skip
9+
klass = Class.new do
10+
my_attr_reader :readable
11+
12+
def initialize
13+
@readable = "readme"
14+
end
15+
end
16+
17+
instance = klass.new
18+
assert_equal "readme", instance.readable
19+
end
20+
21+
def test_multiple_my_attr_readers
22+
skip
23+
klass = Class.new do
24+
my_attr_reader :readable1, :readable2
25+
my_attr_reader :readable3
26+
def initialize
27+
@readable1 = "readme1"
28+
@readable2 = "readme2"
29+
@readable3 = "readme3"
30+
end
31+
end
32+
33+
instance = klass.new
34+
35+
assert_equal "readme1", instance.readable1
36+
assert_equal "readme2", instance.readable2
37+
assert_equal "readme3", instance.readable3
38+
end
39+
40+
def test_duplicated_my_attr_reader
41+
skip
42+
klass = Class.new do
43+
my_attr_reader :readable, :readable
44+
my_attr_reader :readable
45+
def initialize
46+
@readable = "readme"
47+
end
48+
end
49+
50+
instance = klass.new
51+
assert_equal "readme", instance.readable
52+
end
53+
54+
def test_my_attr_reader_initialization
55+
skip
56+
klass = Class.new do
57+
my_attr_reader :readable
58+
59+
def initialize(readable)
60+
@readable = readable
61+
end
62+
end
63+
64+
instance = klass.new("readme")
65+
assert_equal "readme", instance.readable
66+
end
67+
68+
def test_my_attr_reader_changes
69+
skip
70+
klass = Class.new do
71+
my_attr_reader :readable
72+
73+
def initialize
74+
@readable = "readme"
75+
end
76+
end
77+
78+
instance = klass.new
79+
assert_equal "readme", instance.readable
80+
81+
instance.instance_variable_set(:@readable, "readme one more time")
82+
assert_equal "readme one more time", instance.readable
83+
end
84+
85+
def test_my_attr_reader_with_custom_writer
86+
skip
87+
klass = Class.new do
88+
my_attr_reader :readable
89+
90+
def initialize
91+
@readable = "readme"
92+
end
93+
94+
def readable=(r)
95+
@readable = r
96+
end
97+
end
98+
99+
instance = klass.new
100+
assert_equal "readme", instance.readable
101+
102+
instance.readable = "readme one more time"
103+
assert_equal "readme one more time", instance.readable
104+
end
105+
106+
def test_my_attr_reader_instance_methods
107+
skip
108+
klass = Class.new do
109+
my_attr_reader :readable1, :readable2
110+
my_attr_reader :readable3
111+
def initialize
112+
@readable1 = "readme1"
113+
@readable2 = "readme2"
114+
@readable3 = "readme3"
115+
end
116+
end
117+
118+
new_class_methods = klass.instance_methods - klass.superclass.instance_methods
119+
120+
# Check that only expected methods were defined.
121+
assert_equal %i[readable1 readable2 readable3] - new_class_methods, []
122+
end
123+
end
124+

courses/ruby/ex04-myattr/my_attr_writer.rb

Whitespace-only changes.

courses/ruby/ex04-myattr/my_attr_writer_test.rb

Whitespace-only changes.

0 commit comments

Comments
 (0)