## Where communities thrive

• Join over 1.5M+ people
• Join over 100K+ communities
• Free without limits
##### Activity
• 02:34
Blacksmoke16 labeled #13023
• 02:19
cyangle labeled #13023
• 02:19
cyangle opened #13023
• 00:41
devnote-dev labeled #13022
• 00:41
devnote-dev opened #13022
• Jan 27 23:05
straight-shoota labeled #13021
• Jan 27 23:05
straight-shoota labeled #13021
• Jan 27 23:05
straight-shoota labeled #13021
• Jan 27 23:05
straight-shoota labeled #13021
• Jan 27 23:05
straight-shoota opened #13021
• Jan 27 22:40
straight-shoota labeled #13020
• Jan 27 22:40
straight-shoota labeled #13020
• Jan 27 22:40
straight-shoota labeled #13020
• Jan 27 22:40
straight-shoota opened #13020
• Jan 27 21:18
stefandd edited #13018
• Jan 27 20:46
etra0 review_requested #13006
• Jan 27 18:30
Blacksmoke16 closed #13007
• Jan 27 18:30
Blacksmoke16 closed #13019
• Jan 27 18:21
wyhaines closed #13019
• Jan 27 16:56
wyhaines labeled #13019
George Dietrich
@Blacksmoke16
it's a truthy value
ddd
@Dan-Do
:thumbsup:
spTorin
@spTorin
a = 1_000_000_000
puts a.humanize_bytes(format: :IEC)
puts a.humanize_bytes(format: :JEDEC)

0.93GiB
0.93GB
why IEC not puts 1GiB?
From IRC (bridge bot)
@FromIRC
<riza> I think that a GiB is actually 1_073_741_824 B
George Dietrich
@Blacksmoke16
@jgaskins what's the status of the OTLP shard you were working on?
spTorin
@spTorin
@riza but one of them must be derivation of 10^3. In your link:
one gibibyte 1 GiB = 2^30 B = 1 073 741 824 B
one gigabyte 1 GB = 10^9 B = 1 000 000 000 B
In crystal docs:
This method by default uses the IEC standard prefixes (Ki, Mi, Gi, Ti, Pi, Ei, Zi, Yi) based on powers of 1000
spTorin
@spTorin
And if you want get result based on powers of 1000, must use:
puts 1_000_000_000.humanize(base: 1000)   #=> 1.0G
Sean Gregory
@skinnyjames

Hey all
I'm trying to dynamically raise Exceptions from a macro, but when I instantiate the subclassed exception with a message, I get this error:
Error: wrong number of arguments for 'Exception#initialize' (given 1, expected 2)

Can anyone see what i'm doing incorrectly?

 macro generate_error_handling(klass_map)
{% for klass in klass_map.values %}
class {{ klass }} < Exception; end
{% end %}

private def handle_error(body)
if body["value"]? && body["value"].as_h? && body["value"]["error"]?
error = body["value"]
clazz = {{ klass_map }}[error["error"]?]
if clazz
raise clazz.new(error["message"].as_s)
end
end
end
    generate_error_handling(
{
"invalid selector" => InvalidSelectorException,
"no such element" => ElementNotFoundException,
"invalid argument" => InvalidArgumentException,
#...
})
George Dietrich
@Blacksmoke16
can you make a playground link that reproduces it?
Sean Gregory
@skinnyjames
I think so!
George Dietrich
@Blacksmoke16
i think the compiler gets the typing of the hash messed up
can re-write that part to be a case and should work fine
def handle_error(error)
{% begin %}
case error
{% for k, v in klass_map %}
when {{k}} then raise {{v}}.new(error)
{% end %}
end
{% end %}
end
Sean Gregory
@skinnyjames
ah cool.
thanks!
George Dietrich
@Blacksmoke16
pp !!clazz && clazz.is_a?(Exception) # => false
Sean Gregory
@skinnyjames
this will likely be a little less performant right?
I can make the hashmap an array instead if that's easier
George Dietrich
@Blacksmoke16
probably negligible, no that would be worse i think
Sean Gregory
@skinnyjames
ah okay
George Dietrich
@Blacksmoke16
could benchmark it if you want, but i prob wouldn't worry about it too much
ofc it's all moot if you remove the need to convert arbitrary strings into exceptions. i.e. if you already know that you want to raise an unknown method exception because of the string, could just do raise UnknownMethodException.new versus going thru the case at all
but i assume there is more to it than this example?
Sean Gregory
@skinnyjames
definitely did the trick!
i was originally iterating, but I'm just being lazy
Sean Gregory
@skinnyjames

almost ready to beta my project!
https://github.com/skinnyjames/webdriver

It's a w3c compliant OO webdriver that pulls from the Watir api

George Dietrich
@Blacksmoke16
nice one!
Sean Gregory
@skinnyjames
thanks! I'm pretty excited. I've been looking at ruby's Spinach library, and I would like to implement a similar test runner in Crystal
George Dietrich
@Blacksmoke16
sounds like quite the challenge
Sean Gregory
@skinnyjames
yeah, I'll probably be bugging you all a little bit :)
Crystal is definitely my favorite language, so I hope that testing can be a bit more first class
George Dietrich
@Blacksmoke16
in regards to E2E testing you mean?
Sean Gregory
@skinnyjames
yeah,ATDD
i'm happy with Spec
George Dietrich
@Blacksmoke16
everyone i know uses https://www.cypress.io/ for that
main downside is ofc it's JS, but will be a large undertaking to try and match them imo
Sean Gregory
@skinnyjames
cypress is cool, but the api is more cumbersome
the one thing that I really like about it, is by mocking the network deps, you can turn a unit test suite into an e2e test suite with a switch
George Dietrich
@Blacksmoke16
they did just add in the #intercept method, which makes that side of it easier more powerful
i also really like their tooling. How you can see what's going on and interact with snapshots of the UI at each point
Sean Gregory
@skinnyjames
driver.findElement(By.id("username");).sendKeys(username);
vs
browser.element(id: /username/i).set(username)
yeah, I think tooling could be better in selenium, but selenium 4 supports video now
George Dietrich
@Blacksmoke16
wait, neither of those looks like cypress
cy.get('#username').click(); is what im familiar with
Sean Gregory
@skinnyjames
oh lol
I was looking at the wrong docs
George Dietrich
@Blacksmoke16
that would do it :P