beginner.codes 0.1.5 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +39 -0
- data/README.md +1 -0
- data/lib/challenges.rb +95 -39
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 552f7fa00226bf2d727aa23abfee7f4c4be699bfe30bd3148fa1b685a801337a
|
4
|
+
data.tar.gz: 74cb8136a5d6f8c265fe7aa867bcafc3c412db87589dfc5a0091d4eb1e98b967
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 869d24a40f99424ce3d0c5c757fa783224fc24db737ecfbbc764c797407c3d2052ab394753447d0b72a9257c5cccdac7afeac98c72de6b8f174fb5173c36dc3b
|
7
|
+
data.tar.gz: 8c4e974214f01cb317229ee22273234833925ca05b33223ad49c253c74274ec86e6f8cb0be0daaa7a3bffd2719b431fb15922d65abc459675b5cd0084cc0151a
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,42 @@
|
|
1
|
+
# 0.1.7 (14 November 2023)
|
2
|
+
|
3
|
+
---
|
4
|
+
|
5
|
+
## Enhancements
|
6
|
+
|
7
|
+
- Results table now displays arrays properly thanks to the `.inspect` method
|
8
|
+
|
9
|
+
## Bug Fixes
|
10
|
+
|
11
|
+
- Fixed a bug where the Gem completely stopped working.
|
12
|
+
|
13
|
+
## Performance
|
14
|
+
|
15
|
+
## Documentation
|
16
|
+
|
17
|
+
- if it aint fixed, break it
|
18
|
+
|
19
|
+
---
|
20
|
+
# 0.1.6 (11 November 2023)
|
21
|
+
|
22
|
+
---
|
23
|
+
|
24
|
+
## Enhancements
|
25
|
+
|
26
|
+
- Using better colors and now tables for results
|
27
|
+
- Prints Usage instructions if wrong arguments are sent
|
28
|
+
- passing a function is now optional, in case you only need the test info.
|
29
|
+
|
30
|
+
## Bug Fixes
|
31
|
+
|
32
|
+
## Performance
|
33
|
+
|
34
|
+
## Documentation
|
35
|
+
|
36
|
+
- Updated README to include the new arguments
|
37
|
+
- drip drop drip drop
|
38
|
+
|
39
|
+
---
|
1
40
|
# 0.1.5 (9 November 2023)
|
2
41
|
|
3
42
|
---
|
data/README.md
CHANGED
@@ -7,6 +7,7 @@ This is the un-official Ruby Gem for the Beginner.Codes Discord server.
|
|
7
7
|
- Install the package: `gem install beginner.codes`
|
8
8
|
- Import the test runner: `require 'challenges'`
|
9
9
|
- Run the tests, passing in the challenge number and your solution function: `test(458, :n_differences)` for a function or `test(458, n_differences)` for a lambda function
|
10
|
+
- For informatino only you can pass either `description: true` or `examples: true`
|
10
11
|
```ruby
|
11
12
|
require 'challenges'
|
12
13
|
|
data/lib/challenges.rb
CHANGED
@@ -1,13 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
# TODO: use a latest: arg to bring up the last test
|
2
3
|
|
3
4
|
require 'json'
|
4
5
|
require 'uri'
|
5
6
|
require 'net/http'
|
6
|
-
require '
|
7
|
+
require 'pastel'
|
7
8
|
require 'tty-markdown'
|
9
|
+
require 'tty-table'
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
+
|
12
|
+
USAGE = '# **USAGE**
|
13
|
+
```py
|
14
|
+
test(challenge: int, your_function: :func, description: bool, examples: bool)
|
15
|
+
---
|
16
|
+
test(458, :your_function) # runs all tests cases on your function
|
17
|
+
test(458, :your_function, description: true) # adds the test description in the terminal
|
18
|
+
test(458, :your_function, examples: true) # adds test examples in the terminal
|
19
|
+
test(458, :your_function, true, true) # adds both description and examples
|
20
|
+
test(458, description: true) # prints only description without running tests
|
21
|
+
test(458, examples: true) # same as above but with examples```'
|
11
22
|
|
12
23
|
module Status
|
13
24
|
SUCCESS = 1
|
@@ -15,6 +26,25 @@ module Status
|
|
15
26
|
EXCEPTION = -1
|
16
27
|
end
|
17
28
|
|
29
|
+
# passes the colors to the terminal
|
30
|
+
class Colors
|
31
|
+
def initialize
|
32
|
+
@pastel = Pastel.new
|
33
|
+
end
|
34
|
+
|
35
|
+
def respond_to_missing?(name, include_private = false)
|
36
|
+
!name.to_s.empty? || super
|
37
|
+
end
|
38
|
+
|
39
|
+
def method_missing(name, *args)
|
40
|
+
if respond_to_missing?(name)
|
41
|
+
@pastel.send(name, *args)
|
42
|
+
else
|
43
|
+
@pastel.send(:white, *args)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
18
48
|
# captures the result of the test
|
19
49
|
class Result
|
20
50
|
attr_accessor :got, :status
|
@@ -28,25 +58,43 @@ class Result
|
|
28
58
|
end
|
29
59
|
end
|
30
60
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
61
|
+
def make_table(rows)
|
62
|
+
c = Colors.new
|
63
|
+
header = [c.blue('#:'), c.green('Expected:'), c.red('Got:')]
|
64
|
+
rows = rows.map do |row|
|
65
|
+
[c.blue(row[0]), c.green(row[1]), c.red(row[2])]
|
66
|
+
end
|
67
|
+
TTY::Table.new(header, [*rows])
|
68
|
+
end
|
69
|
+
|
70
|
+
def fetch_data(url)
|
71
|
+
Net::HTTP.get(URI(url)).force_encoding('UTF-8')
|
40
72
|
end
|
41
73
|
|
42
74
|
# fetches the result from the source
|
43
75
|
def get_tests(challenge)
|
44
|
-
|
45
|
-
|
46
|
-
|
76
|
+
url = "https://raw.githubusercontent.com/beginner-codes/challenges/main/weekday/test_cases_#{challenge}.json"
|
77
|
+
begin
|
78
|
+
JSON.parse(fetch_data(url))
|
79
|
+
rescue RuntimeError => e
|
80
|
+
e
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
47
84
|
|
48
|
-
|
85
|
+
# fetches the description from source
|
86
|
+
def get_info(challenge, description, examples)
|
87
|
+
url = "https://raw.githubusercontent.com/beginner-codes/challenges/main/weekday/challenge_#{challenge}.md"
|
88
|
+
result = ''
|
49
89
|
|
90
|
+
begin
|
91
|
+
info = fetch_data(url)
|
92
|
+
result += info.split('## ').first.gsub("\n\n", "\n") << "\n" if description
|
93
|
+
result += info.split('#')[3].gsub("\n\n", "\n").insert(0,'#') if examples
|
94
|
+
rescue IndexError || RuntimeError => e
|
95
|
+
result += e
|
96
|
+
end
|
97
|
+
TTY::Markdown.parse(result + '***')
|
50
98
|
end
|
51
99
|
|
52
100
|
# parses your functions and checks if it passes
|
@@ -55,12 +103,7 @@ def run_tests(tests, solution_func)
|
|
55
103
|
tests.each_with_index do |test_case, index|
|
56
104
|
result = Result.new(index, test_case['return'])
|
57
105
|
begin
|
58
|
-
result.got =
|
59
|
-
solution_func.call(*test_case['args'])
|
60
|
-
else
|
61
|
-
send(solution_func, *test_case['args'])
|
62
|
-
end
|
63
|
-
|
106
|
+
result.got = solution_func.is_a?(Proc) ? solution_func.call(*test_case['args']) : send(solution_func, *test_case['args'])
|
64
107
|
rescue StandardError => e
|
65
108
|
result.status = Status::EXCEPTION
|
66
109
|
result.got = e
|
@@ -73,27 +116,40 @@ def run_tests(tests, solution_func)
|
|
73
116
|
end
|
74
117
|
|
75
118
|
# displays the results on the terminal
|
76
|
-
def show_results(challenge, results, total_tests)
|
119
|
+
def show_results(challenge, results, total_tests, info)
|
120
|
+
puts info
|
121
|
+
c = Colors.new
|
122
|
+
rows = []
|
77
123
|
failures = 0
|
78
124
|
results.each do |result|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
puts "Test #{result.index} failed: #{result.got}"
|
84
|
-
failures += 1
|
85
|
-
end
|
125
|
+
next unless result.status.equal?(Status::FAILED) or result.status.equal?(Status::EXCEPTION)
|
126
|
+
|
127
|
+
rows << [result.index, result.expected.inspect, result.got]
|
128
|
+
failures += 1
|
86
129
|
end
|
87
|
-
|
88
|
-
|
89
|
-
puts
|
90
|
-
|
130
|
+
|
131
|
+
table = make_table(rows)
|
132
|
+
puts table.render(:unicode, alignment: %i[right left left]) if failures
|
133
|
+
return if results == []
|
134
|
+
|
135
|
+
puts c.yellow("---- Challenge #{challenge} Results ----")
|
136
|
+
puts "#{c.green(total_tests - failures)} passed, #{c.red(failures)} failed"
|
137
|
+
puts c.green("\n**** Great job!!! ****") if failures.zero?
|
91
138
|
end
|
92
139
|
|
93
140
|
# the main entry point function
|
94
|
-
def test(challenge, solution_func, description: false, examples: false)
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
141
|
+
def test(challenge = nil, solution_func = nil, description: false, examples: false)
|
142
|
+
if solution_func
|
143
|
+
tests = get_tests(challenge)
|
144
|
+
results = run_tests(tests, solution_func) unless tests.kind_of? RuntimeError
|
145
|
+
else
|
146
|
+
tests = []
|
147
|
+
results = []
|
148
|
+
end
|
149
|
+
info = if solution_func || examples || description || challenge
|
150
|
+
get_info(challenge, description, examples)
|
151
|
+
else
|
152
|
+
TTY::Markdown.parse(USAGE)
|
153
|
+
end
|
154
|
+
show_results(challenge, results, tests.size, info)
|
99
155
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beginner.codes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mr. Robinhood 5
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-11-
|
12
|
+
date: 2023-11-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: pastel
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 0.8.0
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 0.8.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: tty-markdown
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|