Git Product home page Git Product logo

Comments (8)

ajvondrak avatar ajvondrak commented on May 24, 2024 1

Looking at it, I think I'd like a name that would make a good namespace for both individual IPs and ranges. RemoteIp.Block.encode/1 actually encodes a single IP, so it reads kind of awkwardly when it's in the same module as the IP block functions. Would rather an Address.encode/1 and a Block.contains?/2 sort of distinction. 🤔

from remote_ip.

ajvondrak avatar ajvondrak commented on May 24, 2024 1

Yes, all good points. I was thinking many of the same things in my brain's background threads. 😄 If it's going to be a first-class library, it's probably better to provide a more flexible & complete API. Plus a "safe" API for doing the all-too-common Enum.any?(&contains?) check. Just have to document all the performance caveats.

I'll see what I can put together this weekend, even if it's just a v0.1.0 with the exact same interface as the current RemoteIp.Block. :shipit:

from remote_ip.

ajvondrak avatar ajvondrak commented on May 24, 2024 1

Okay, I have the repo live at https://github.com/ajvondrak/bitwise_ip. Tests all pass, the API seems stable enough, and the benchmarks show it to be on par with remote_ip. I also went on some side quests doing fun things like implementing the Enumerable protocol on BitwiseIp.Block. 🙃

To do:

  • get all the packaging figured out so I can publish v0.1.0 to hex.pm; I'm going to try to get that done today
  • docs; I doubt I'll get them done today, so I'll throw some generic "under construction" stuff up for the development release
  • after docs are ready, it's probably okay to ship it as v1.0.0 (i.e., the first not-development release)
  • any other feature requests? feedback?

Edit: Oh yeah, and the future goal of moving RemoteIp onto using BitwiseIp, of course.

from remote_ip.

ajvondrak avatar ajvondrak commented on May 24, 2024

Sure, I'd love to split it off into a separate package! Makes me happy to know someone noticed my yak shaving. 😛

It shouldn't be that much work - really, just the plumbing and docs and all, but that's mostly a matter of copy/paste/rearrange. I can make a little weekend project of it. I guess the hardest part would be coming up with a good name. 😄 Any suggestions? IpBlock?

from remote_ip.

halostatue avatar halostatue commented on May 24, 2024

I think that IpBlock is a good name, which would allow for IpBlock.Address.encode/1 and IpBlock.contains?/2.

From a usability perspective, it would probably be good if IpBlock.contains?/2 handled both encoded and unencoded IPs and parsed and unparsed ranges. This would make it (reasonably) possible to use the library correctly without making silly mistakes like I did and you pointed out. I’d say maybe something like this for a spec:

@type t :: %__MODULE__{}
@type encoded_range :: t | list(t)
@type unencoded_range :: binary() | list(binary())
@type range :: encoded_range | unencoded_range
@type unencoded_ip :: binary()
@type encoded_ip :: {:v4 | :v6, integer()}
@type ip :: encoded_ip | unencoded_ip

@spec contains?(range, ip) :: boolean()

If it would be preferable to have the list handling separately, then any_contains?/2 might be viable (even though that’s pretty much the same as Enum.any?(ranges, &contains?(&1, encoded_ip). I am thinking that the implementation of these would make it harder to use the library wrong, but it would still be worth documenting the advantages of pre-encoding/pre-parsing for long-term performance in tight loops.

from remote_ip.

halostatue avatar halostatue commented on May 24, 2024

Thanks! I’ll wait to release my package until you’ve got the 0.1.0 released.

from remote_ip.

halostatue avatar halostatue commented on May 24, 2024

I’ll look at this a bit later and give you some feedback.

from remote_ip.

ajvondrak avatar ajvondrak commented on May 24, 2024

Closed via ajvondrak/bitwise_ip#1. 🎉

from remote_ip.

Related Issues (16)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.