differences python-dbus and node-dbus

I'm not exactly sure where the best place to talk about such things is, so I guess I'll start here.
quoting http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html
To call a method, call the method of the same name on the proxy object, passing in the interface name via the dbus_interface keyword argument:

import dbus
bus = dbus.SystemBus()
eth0 = bus.get_object('org.freedesktop.NetworkManager',
                      '/org/freedesktop/NetworkManager/Devices/eth0')
props = eth0.getProperties(dbus_interface='org.freedesktop.NetworkManager.Devices')
# props is a tuple of properties, the first of which is the object path

As a short cut, if you're going to be calling many methods with the same interface, you can construct a dbus.Interface object and call methods on that, without needing to specify the interface again:

import dbus
bus = dbus.SystemBus()
eth0 = bus.get_object('org.freedesktop.NetworkManager',
                      '/org/freedesktop/NetworkManager/Devices/eth0')
eth0_dev_iface = dbus.Interface(eth0,
    dbus_interface='org.freedesktop.NetworkManager.Devices')
props = eth0_dev_iface.getProperties()
# props is the same as before

I definitely am not really familiar with js beyond what I do for web work, so please excuse my ignorance here.
What do you think about having the equivalent of bus.get_object and passing those around instead of having to name everything at time of call (in two different variables)
I also like being able to store the result of dbus.Interface and being able to add methods to it later instead of nesting a bunch of callbacks.
Maybe this is more of a documentation problem (and my lack of true understanding here). It would be nice to see more documentation and examples.

I think we already have this - https://github.com/sidorares/node-dbus/blob/15402ff01260931e9377aabb33997f59ba51d1d7/lib/bus.js#L260-L275 ( or maybe I not understand the question correctly )

but there seems to be no way to work without it without nesting callbacks?
Here's sandeep's first try at implementing the bluez dbus API. https://github.com/sandeepmistry/noble/blob/51c0154aa97adaaf4466fb9f886072d004336027/lib/linux-bindings.js . It's just a prototype, so it's certainly not organized super well.
I wanted to be able to store the result of getInterface here: https://github.com/sandeepmistry/noble/blob/51c0154aa97adaaf4466fb9f886072d004336027/lib/linux-bindings.js#L23 to avoid another callback nesting level, but getInterface() doesn't actually return anything.
Compare that to the equivalent python dbus code here:
https://github.com/adafruit/Adafruit_Python_BluefruitLE/blob/master/Adafruit_BluefruitLE/bluez_dbus/adapter.py (where dbus_obj is  the result of bus.Interface(self._bus.get_object('org.bluez', '/'), 'org.freedesktop.DBus.ObjectManager')

depends on what we want as interface: if we want to populate all the functions from introspection data then it's a callback ( need to wait result of introspection and create proxy ). If it's dumb object ( just one that captured path/object name/interface name) then no need for callback
Also potentially possible to use js Proxy object and transform 'unknown' method calls into dbus calls ( no need to callback again, 'late binding' type of call )

I think the js proxy object you suggested is how the python API works.

unfortunately older node versions would require --harmony-proxies flag.
To build libraries like bluez wrapper I think better way is to generate client code ahead of time - there is a script for that - https://github.com/sidorares/node-dbus/blob/master/bin/dbus2js.js

On that note, what is your approach to node version compatibility?  I can't see a good reason to keep 0.8.x support around, but I'm not sure of anything beyond that.

I'm ok to drop 0.8 if there is serious reason to, but would like to keep support for 0.10 for some time ( and 0.10 is not very es6 friendly )

so how long do you wanna keep 0.10 around for? looks like nodesource finally makes 4.x and 5.x available even on el6 and ubuntu precise (as of about 20 hours ago or so)

Have you used the results of dbus2js to build something before? it doesn't seem to handle something like this well, as the path is encoded. I guess the code generator should turn that into a variable/property, but I wonder if it's possible to do in a generic way.
bin/dbus2js.js --bus system --service org.bluez --path /org/bluez/hci0/dev_C4_06_E7_C7_5D_5D
    property:
 { '@': { name: 'Address', type: 's', access: 'read' } }
    property:
 { '@': { name: 'Name', type: 's', access: 'read' } }
    property:
 { '@': { name: 'Alias', type: 's', access: 'readwrite' } }
    property:
 { '@': { name: 'Class', type: 'u', access: 'read' } }
    property:
 { '@': { name: 'Appearance', type: 'q', access: 'read' } }
    property:
 { '@': { name: 'Icon', type: 's', access: 'read' } }
    property:
 { '@': { name: 'Paired', type: 'b', access: 'read' } }
    property:
 { '@': { name: 'Trusted', type: 'b', access: 'readwrite' } }
    property:
 { '@': { name: 'Blocked', type: 'b', access: 'readwrite' } }
    property:
 { '@': { name: 'LegacyPairing', type: 'b', access: 'read' } }
    property:
 { '@': { name: 'RSSI', type: 'n', access: 'read' } }
    property:
 { '@': { name: 'Connected', type: 'b', access: 'read' } }
    property:
 { '@': { name: 'UUIDs', type: 'as', access: 'read' } }
    property:
 { '@': { name: 'Modalias', type: 's', access: 'read' } }
    property:
 { '@': { name: 'Adapter', type: 'o', access: 'read' } }
    property:
 { '@': { name: 'ManufacturerData', type: 'a{qv}', access: 'read' } }
    property:
 { '@': { name: 'ServiceData', type: 'a{sv}', access: 'read' } }
    property:
 { '@': { name: 'TxPower', type: 'n', access: 'read' } }
    property:
 { '@': { name: 'GattServices', type: 'ao', access: 'read' } }
module.exports['org.freedesktop.DBus.Introspectable'] = function(bus) {
    this.addListener = this.on = function(signame, callback) {
        bus.addMatch('type=\'signal\',member=\'' + signame + '\'', function(err, result) {
            if (err) throw new Error(err);
        });
        var signalFullName = bus.mangle('/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D', 'org.freedesktop.DBus.Introspectable', signame);
        bus.signals.on(signalFullName, function(messageBody) {
             callback.apply(null, messageBody);
        });
    };
    this.Introspect = function(callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.freedesktop.DBus.Introspectable',
            member: 'Introspect',
        }, callback);
    };
}
module.exports['org.bluez.Device1'] = function(bus) {
    this.addListener = this.on = function(signame, callback) {
        bus.addMatch('type=\'signal\',member=\'' + signame + '\'', function(err, result) {
            if (err) throw new Error(err);
        });
        var signalFullName = bus.mangle('/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D', 'org.bluez.Device1', signame);
        bus.signals.on(signalFullName, function(messageBody) {
             callback.apply(null, messageBody);
        });
    };
    this.Disconnect = function(callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.bluez.Device1',
            member: 'Disconnect',
        }, callback);
    };
    this.Connect = function(callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.bluez.Device1',
            member: 'Connect',
        }, callback);
    };
    this.ConnectProfile = function(UUID, callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.bluez.Device1',
            member: 'ConnectProfile',
            body: [UUID],
            signature: 's',
        }, callback);
    };
    this.DisconnectProfile = function(UUID, callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.bluez.Device1',
            member: 'DisconnectProfile',
            body: [UUID],
            signature: 's',
        }, callback);
    };
    this.Pair = function(callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.bluez.Device1',
            member: 'Pair',
        }, callback);
    };
    this.CancelPairing = function(callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.bluez.Device1',
            member: 'CancelPairing',
        }, callback);
    };
}
module.exports['org.freedesktop.DBus.Properties'] = function(bus) {
    this.addListener = this.on = function(signame, callback) {
        bus.addMatch('type=\'signal\',member=\'' + signame + '\'', function(err, result) {
            if (err) throw new Error(err);
        });
        var signalFullName = bus.mangle('/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D', 'org.freedesktop.DBus.Properties', signame);
        bus.signals.on(signalFullName, function(messageBody) {
             callback.apply(null, messageBody);
        });
    };
    this.Get = function(interface, name, callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.freedesktop.DBus.Properties',
            member: 'Get',
            body: [interface, name],
            signature: 'ss',
        }, callback);
    };
    this.Set = function(interface, name, value, callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.freedesktop.DBus.Properties',
            member: 'Set',
            body: [interface, name, value],
            signature: 'ssv',
        }, callback);
    };
    this.GetAll = function(interface, callback) {
        bus.invoke({
            destination: 'org.bluez',
            path: '/org/bluez/hci0/dev_C4_06_E7_C7_5D_5D',
            interface: 'org.freedesktop.DBus.Properties',
            member: 'GetAll',
            body: [interface],
            signature: 's',
        }, callback);
    };
}

not a lot, but yes - https://github.com/sidorares/node-gday/blob/master/lib/index.js
probably need to add 'specify what should go as input parameter' functionality

so how long do you wanna keep 0.10 around for
probably until 6.0

re Proxy vs async Introspection results: do you think we should keep both? or you'd prefer to see getInterface() to return proxy object?
I'm also thinking about Promise api in addition ( or instead of ) errbacks when async/await is available ( for methods and properties )

probably need to add 'specify what should go as input parameter' functionality

Not just that, but also set some properties so stuff like destination: 'org.bluez' is instead destination: this._serviceName or something to that effect.

I should have also asked about how long you plan on keeping 0.12.x around too.

about proxy vs async.. I feel like I'm not the right person to answer this. My judgment is too clouded by not working enough with js, and spending most of my time with languages like ruby, php, and python (and a little C/C++).

I should have also asked about how long you plan on keeping 0.12.x around too.
as long as node-abstractsocket supports it

definitely different than my feeling of js without es6!  I'm itching to move to any node version that supports es6 modules out of the box. Coding js feels without es6 feels like coding php 4.x + first class functions.

I was thinking about this module as a relatively low level layer, maybe make dbus2js script to generate whatever modern es6/7 flavor user wants ( Promise/generators/async-await based )


Question about this project

You won't maintain this project anymore?

Hello, yes we're not maintaining this project anymore (in fact that was already the case, we haven't committed anything serious for more than a year)
You should look into Puppeteer or Playwright instead :)


'AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS': undeclared identifier

Why the output windows shows the error: " 'AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS': undeclared identifier" when I build the SwapAPO project.

Did anything  else I need to do before to build.

I have the same problem.


Update quickstart

Tune it for use with slush-marklogic-node, and mention ctrl.filter..

Fixed in gh-pages branch..


display post from the wall only and not activity

Hi pavelk2!,
fisrt of all, thanks for this great plugin, works pretty well!
In the facebook part ....is there a way to show the wall post only?... right now are displaying all the activity in the fanpage and we need, for now, to display the post made it by the owner and nothing else.
thanks so much!

Here is the place where you can add some extra filtering:
https://github.com/pavelk2/social-feed/blob/gh-pages/index.html#L103-L105
you can write there something like:
return (content.social_network == "facebook") ? content.author_name == "PAGE_OWNER_USERNAME" : true;

@chidalgom
Please let me know if the answer above is sufficient, so we can close this issue.
thanx.

Hi pavelk2, sorry for not answer before, but i was testing your suggestion, unfortunately im not the owner so have some delay trying to contact them to make changes for testing.
As i can tell works fine, but now have some doubts, if you can help me of course, to clear them.
as I ask you before, need to show anything but the post's owner, its important to hidde or not show at all, for example, if the owner likes some others photo (that is the activity right?), in other words, need to hide all the content not related to posts, and im not sure if the filtering you give me work whit this.
On the other hand some parte of the text are in english, for example right now says: "fanpage shared Arte de Sanar's photo", as you can see there's a mix of language and should be displayed totally in spanish, was looking around the files and find some words, but only related to timelines like days, months, ago, etc, was able to change it to my language and works great, but that particular content not... so, is there a way to change that too? ...was reading on forums and facebbok help page, but as a noob dont understand very well how to make it.
sorry for all the trouble and time im make you waste, but need to do that for this project.

Dear @chidalgom,
please write me an email<EMAIL_ADDRESS>with details - which accounts you need to use from which social networks, what kind of posts you want to show and what you want to hide. I will help you out with it. But this is not the topic of this issue - as issues are solely plugin related.

ok my friend... will contact you by email then.
thanks a lot!

I'm also trying to filter a facebook feed to only show posts and no activity. Any news here?
Thanks @pavelk2

You can try this moderation function:
https://gist.github.com/pavelk2/46d9d744c30d9aa81b3d
On Sun Jan 11 2015 at 1:09:55 PM Markus<EMAIL_ADDRESS>wrote:

I'm also trying to filter a facebook feed to only show posts and no
activity. Any news here?
Thanks @pavelk2 https://github.com/pavelk2
—
Reply to this email directly or view it on GitHub
https://github.com/pavelk2/social-feed/issues/55#issuecomment-69492309.

This seems to work. Thanks a lot.
But now the filtered items got a "hidden" class with a red background. If i hide this item the my limit of item is wrong. How can i fix that?

@Craffft , unfortunately currently there is no way to do this filtering. The single possible solution i currently see is to ask a server more posts and limit them on client side instead of server side. But again it is not very elegant. Let me know if you come up with better solution. Feel free to create another issue for that and submit your pull request.

Yep, i will definitely try a few solutions in the next days. I think i will go with the limitation on the client side. Thanks @pavelk2

BTW - i am working now on a node.js server application (which anybody in 3 steps will be able to host on Heroku without a need to have an experience with node) - which should care all the interaction with social-networks, so all the credentials will not be publicly visible (as now). I will let you know as soon as it is ready.


Submissions page shows an HTTP 500 error

What I've done:

[x] created a private Git repository
[x] copied the deploy key and added it to the repository
[x] created a branch called submission
[x] downloaded a starter kit
[x] committed and pushed the starter kit
[x] waited for more than 10 minutes

Here's the problem:
The submissions page shows "Something went wrong. Server answer is 500" as error message. I've seen it work about two hours ago with two submissions visible.

Oops... my fault. Will fix immediately.

@jmerle Hope it's resolved now. Feel free to reopen this issue in any case!

Yep, it's resolved, thanks!
I also noticed I accidentally leaked my API key in the first revision of the opening post of this issue, so I created a new team and abandoned the old one (the old team is now called "oops_leaked_my_api_key").

@jmerle Thanks for mentioning that! Gonna disable that team.


Wdr 07 14

Description
WDR Changes:

Set dynamic text to a series like the SDI, since we weren't otherwise seeing the series showing up
Initialize the label for SDI correctly
Fix series loading being extremely slow. Code is left as a comment because it's a feature that could theoretically exist but needs more optimization to work.
Catch division by zero in RLCS
Disable mouse resizing plots, as it seems to be quite glitchy and we don't want to take risks
Calculate heater resistance correctly
Add rocket power field

Developer Testing

Here's what I did to test my changes:

Changes were validated at WDR and work. Not going to change it if it works.

Reviewer Testing

Here's what you should do to quickly validate my changes:

N/A

This change is

Disables resizing of plots, since it seemed to be causing some DAQ issues.


[Bug]: OAuth - As per zeplin - for the Authentication type as OAuth2.0, the manage env page is not matching

Is there an existing issue for this?

[X] I have searched the existing issues

Description
For OAuth DS - As per zeplin - for the Authentication type as OAuth2.0, the manage env page is not matching
Steps To Reproduce

Create an OAuth DS. Save the DS. Go to Manage Env page
The UI for the fields here is not as per Zeplin.
As per Zeplin -  When OAuth2.0 is selected as Authentication type, The fields associated with OAuth2.0 appear slightly tabbed to the right to indicate that they are Associated with Authentication Type.
Also, for each of the bound value representation is represented in the format "dsname.authentication_type.field_name"
At present, in the DP, the above format is not followed. It is only represented as "dsname.field_name"
Also there is no Authentication Type field available for selection at all

View zeplin screenshot below -

Public Sample App
No response
Issue video log
No response
Version
EC2 instance

THis is done due to server restrictions. Let's connect and discuss further on this.


[docs]: fix typo in compilation-model.tex

fixes a minor typo i noticed while reading

@swift-ci Please smoke test


Issues with TLS client authentication

While setting up Calico in our OpenStack deployment we've encountered issues when trying to use TLS authentication to access etcd cluster.
To reproduce:

Setup etcd cluster with TLS client authentication
Create new client c = Etcd3Client(host="server", protocol="https", ca_cert="server_ca.crt", cert_cert="user.crt", cert_key="user.key")
try to get some random key c.get("random_key")
You should get TLS alert bad certificate or CERTIFICATE_VERIFY_FAILED if you don't have server_ca in your system trust.

When looking through the source code we've noticed that the TLS parameters are stored in self.kwargs and then never used.
https://github.com/dims/etcd3-gateway/blob/11cf6c43f1f737be29a175d40eca4b714ef82548/etcd3gw/client.py#L55
When edited to actually set the values on the session object, the TLS auth started working.
Issue appeared on both Ubuntu Xenial (Python 2.7.12, OpenSSL 1.0.2g) and Fedora 27 (Python 2.7.14, OpenSSL 1.1.0h).

@ThatIsGeek can you please submit a patch?

@dims sure :) I am already working on it. Sorry for not mentioning it in the report.


Add revive splash animation

This will require the cardjitsu_snowrevive.swf file, which still needs to be added to vanilla-media. Will merge it once it's there.

Enjoy the merge commits lmao

I'll just add the cardjitsu_snowrevive.swf to the swf folder for now


Run_in_executor pattern over the userlist in enumeration module eats up memory unpredictably with large lists

If you have a large list of likely users to enumerate with --enum, say more than 7 million (common when inferring emails from popular names in a country, for instance), o365spray will use tons of memory, more than 16GB in some cases (regardless of --enum-method).
This is likely due to this pattern of concurrency in o365spray/core/handlers/enumerator/modules/base.py:
        blocking_tasks = [
            self.loop.run_in_executor(
                self.executor,
                partial(
                    self._enumerate,
                    domain=domain,
                    user=user,
                    password=password,
                ),
            )
            for user in userlist
        ]

        if blocking_tasks:
            await asyncio.wait(blocking_tasks)

If there was a concurrency limit of some sort, such as what is suggested here, I suspect this wouldn't happen. This limit could be set to a sufficiently high value like 10000 by default to mitigate this issue for large wordlists and also prevent performance impacts for smaller wordlists. It could also be configurable in an argument for better flexibility.

I like this approach and if you wanted to open a PR I would be happy to test/review and merge.
The only thing I noticed that would be blocking for a merge is that you are using loop.create_task to execute each enumerator call. In the original code, we are using loop.run_in_executor specifically to leverage the ThreadPoolExecutor to honor the specified threads the user defined via the --rate flag. To my understanding, the updated implementation would not honor the threads so we would need to either move back to the original call to run_in_executor or implement a Semaphore to execute the tasks through.

Hey @0xZDH, thanks for the reply =)
At the risk of being too naive, I can't help but to wonder whether a ThreadPoolExecutor is really needed in this particular use case. Maybe we'd get the same performance by just using coroutines and replacing conlimit from my commit for your original rate?
I don't have a clear answer right now, but it's something I've been thinking about.

I wrote this with 0 validation or testing, but the idea is to leverage both your concurrency tasks limit and a Semaphore for async concurrency execution limits:
        semaphore = asyncio.Semaphore(args.rate)

        async def async_enumerat(domain: str, user: str, password: str = "Password1"):
            """Async call of enumerate"""
            return self._enumerate(domain=domain, user=user, password=password)

        async def safe_enumerate(domain: str, user: str, password: str = "Password1"):
            """Safe call to enumerate to keep within bounds of concurrency limits"""
            async with semaphore:
                return await async_enumerat(domain=domain, user=user, password=password)

        blocking_tasks = set()

        for user in userlist:
            # Check the concurrency task limit and wait if we reach the upper bound
            # Default: 1,000 concurrency task limit
            if len(blocking_tasks) >= 1000:
                _, blocking_tasks = await asyncio.wait(
                    blocking_tasks,
                    return_when=asyncio.FIRST_COMPLETED,
                )

            # Add new tasks as task pool frees up
            blocking_tasks.add(
                self.loop.create_task(
                    safe_enumerate(
                        domai=domain,
                        use=user,
                        passwor=password,
                    )
                )
            )

Hey @0xZDH, thanks for the reply =)
At the risk of being too naive, I can't help but to wonder whether a ThreadPoolExecutor is really needed in this particular use case. Maybe we'd get the same performance by just using coroutines and replacing conlimit from my commit for your original rate?
I don't have a clear answer right now, but it's something I've been thinking about.

After some testing I don't think this is the case anymore. Ditching ThreadPoolExecutor in favor of coroutines in this case seems to hurt performance, in either my solution or yours... But take a look at this test using this idea:
import asyncio
import random
import matplotlib.pyplot as plt
from concurrent.futures import ThreadPoolExecutor, wait, FIRST_COMPLETED
import time
import requests

loop = asyncio.get_event_loop()
N = 7000000
CONLIMIT = 1000
RATE = 10

def download(code, completion_times):
    requests.get('http://www.github.com/', headers={'Cache-Control': 'no-cache'})
    completion_times.append((code, loop.time()))
    print(f'Downloaded {code}', completion_times[-1])

def consume(threads: list, max_n: int = CONLIMIT):
    while len(threads) > max_n:
        done, _ = wait(threads, return_when=FIRST_COMPLETED)
        for t in done:
            t.result()
            del threads[t]

async def main(executor):
    completion_times = []

    threads = {}
    for x in range(N):
        future = executor.submit(download, x, completion_times)
        threads[future] = x
        consume(threads)
    consume(threads, 0)

    codes, times = zip(*completion_times)
    plt.scatter(times, codes)
    plt.xlabel('Time (ms)')
    plt.ylabel('Task Code')
    plt.title('Task Completion Times')
    plt.savefig('test4.png')

executor = ThreadPoolExecutor(RATE)

try:
    loop.run_until_complete(main(executor))
finally:
    loop.close()

It runs really fast and seems to prevent the issue. I'm going to experiment a little bit more with that idea on o365spray's code and come back later with a pull request if it works.

I think it works, can you test it so we can maybe proceed to a pull request?
Proposed Fix

@Macmod - Thanks for looking into this further and testing it out a bit. I ran some local tests with the original code base, your updated code base, and another local alternative I wrote that just limited the number of blocking tasks at any given time. While I was able to match your memory management, the overall performance was far superior using your method.
If you want to open up a PR for this change, I would be happy to run some final tests and merge it into the main branch.
Before merging though, I wanted to mention a few things regarding the overall code formatting and style to ensure consistency with the rest of the code base:

If you could document the _consume_threads function and its parameters (see the run() function for docstring formatting).
The threads parameter in the _consume_threads function is typed as a list, but it is actually a Dictionary. Is there a reason for using a dictionary or is it just for easier access to the given Future object when deleting it on completion? Whichever is the cleaner solution, would be great if you could update the type reference.
Lastly, while not a style or formatting suggestion, the newly added --conlimit parameter mentions "Concurrency limit", but the --rate parameter more aligns with the actual concurrency executed within the executor whereas the new flag value relates more to the pool size of the executor. I would suggest maybe using --poolsize to reflect this?

The above are just suggestions to closer align to the existing code base, but please open a PR and I am happy to merge. Thanks again for your efforts on this - awesome work!

Hey @0xZDH, you're right in your suggestions, I have included them in the PR.
Thanks again for the collaboration! 👍

Just a quick note - the same issue probably exists in the sprayer module, but I can't test it right now. Anyway, it's more logic that people will only use large lists with the enumerator module and then perform spraying on top of the valid emails found. If you're interested I can check it another time and send a new PR so we can keep things consistent 😃

This has now been merged into the main branch. Awesome work @Macmod!
Regarding spraying -- I think for now enumeration is enough as you mentioned that most scenarios won't require massive lists for spraying, only enumeration. If there is a need to update, we can revisit.


cmd/go: inconsistent reporting of default Go version

In the transcript below, there is no go line in the go.mod.
Builds say I can't use post-Go 1.16 features, but then when I say
"go get<EMAIL_ADDRESS>(using a sufficiently old version so as not to break any users),
it claims I am downgrading from Go 1.24.
% go install
# rsc.io/tmp/jsonfmt
./jsonfmt.go:95:9: predeclared any requires go1.18 or later (-lang was set to go1.16; check go.mod)
% cat go.mod
module rsc.io/tmp/jsonfmt
% go get<EMAIL_ADDRESS>go: downgraded go 1.24 => 1.21.0
go: added toolchain go1.24
% cat go.mod
module rsc.io/tmp/jsonfmt

go 1.21.0

toolchain go1.24
%

Related Issues and Documentation

cmd/go: using go get go@{version} in a module without a go directive can print a misleading "downgraded" message #63507
cmd/go: Go modules initialised by go1.21.1 cannot be built using go1.20.8 #63279 (closed)
cmd/go: need to backport relaxing of go.mod go verb constraints to 1.11 series #28974 (closed)
cmd/go: breaking change in 1.23rc2 with version constraints in GOPATH mode #68658 (closed)
cmd/go: go toolchain version switch doesn't work when only language version is set in go.mod #65580 (closed)
cmd/go: on malformed "go mod edit -go", suggest current version of go, not hardcoded 1.12 #32286 (closed)
cmd/go: automatic toolchain upgrades make the combination of `go version` and `go install <package>@<version>` confusing #66518
cmd/go: `go env GOMOD` tries to download newer toolchain #61455 (closed)
cmd/fix: fails to run on modules whose go directive value is in "1.n.m" format introduced in Go 1.21.0 #62584 (closed)
cmd/compile: Go 1.22 changes support for modules that declare `go 1.0` #65528 (closed)

(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)

cc @matloob @samthanawalla

Hi @matloob @samthanawalla , could you kindly review the CL when you have a moment? Thank you!


Updated RMP Tags

Overview
Resolves RMP Tags being loaded in
Loaded in the RMP Tag data and output the top 10 under the graph
What Changed
singleProfInfo.tsx was the only updated file. Added a section for the tag data to be loaded in

@GovindRangappa @RVC13850 @TyHil is there any reason to ever omit tags from the top 10 because of their frequency?
https://utd-trends-1qa6ktyhi-utdnebula.vercel.app/dashboard?searchTerms=Gopal+Gupta
Like Tough grader, (1) Skip class? You won't pass. (1), Amazing lectures (1), Clear grading criteria (1)
I'm leaning towards leaving it as is because you can see the frequency

Also (all 3 of you) for the above commit:

I removed outline
I made the text bigger. Should it go back to being smaller? Should I add padding? Is it fine as-is?
In dark mode, should the bg color be darker?

What are your thoughts on these changes?

vs

Should the overall tooltip have a hover at all?

@TyHil is there a better way to find topTags in searchResultsTable.tsx?

Looks good to me. We could do the sorting immediately once the data is fetched tho so it's not done in multiple places
@GovindRangappa what do you think about the other questions?

on light mode make it cornflower 100. on dark mode maybe keep the outline and match color with star

@GovindRangappa @TyHil do you think (in dark mode) the color of the tag needs to be the same as the stars?

Depends on how much we want to emphasize the tags. I'm not sure if they really need to pop like that

I like how the purple make the tags in the dropdown card look in dark mode. Only thing that I think has the potential to look better is centering the tags above the course name when hovered over rather than staggering them to the right. I do like the commas better than the | thing as it's a familiar punctuation that people are used to seeing and understanding.

WHAT! ANIMATIONS!!!!!!!

guys this might increase the engagement time on our website I WILL BE CLICKING THE MORE TAGS ANIMATION

Andrew Nemec has no ratings - https://utd-trends-l3ddjbdvm-utdnebula.vercel.app/dashboard?searchTerms=Andrew+Nemec -> Should indicate no tags found?
B. Chitturi's RMP is not found by trends - https://utd-trends-l3ddjbdvm-utdnebula.vercel.app/dashboard?searchTerms=Bhadrachalam+Chitturi -> No tag on hover, maybe it should indicate that there are no tags found?

Andrew Nemec has no ratings - https://utd-trends-l3ddjbdvm-utdnebula.vercel.app/dashboard?searchTerms=Andrew+Nemec -> Should indicate no tags found? B. Chitturi's RMP is not found by trends - https://utd-trends-l3ddjbdvm-utdnebula.vercel.app/dashboard?searchTerms=Bhadrachalam+Chitturi -> No tag on hover, maybe it should indicate that there are no tags found?

oh yeah good point, lemme fix that

The B. Chitturi case messes with the overall no-tag

@TyHil idt that fixes Chitturi. I get nothing on hover for him. I think it's because his rmp data is null (same for overall)

@AbhiramTadepalli ok that should do it. It will either say "No Tags Available" or list the tags on every results unless it's just a course, like "CS 1200 (Overall)"


Add eth address field base card

eth address field card

returns error warning when field is not an address or not checksummed
can save wrong field still
Perhaps BlockchainAddressCard might be a better name. Tho its one of those things where it doesn cover bitcoin address but it covers polygon addresses. I think Eth address is an ok name

I think it would be better if the validation had two different messages - one for general validity (isEthAddress) and the other one for checksum check (isChecksumAddress). But not a blocker at all and I'm fine with too

ive fixed it here


License?

Would you consider adding an open-source license to this project? Without one, many will hesitate to  use it in production codebases.
Quoting opensource.org:

Can I call my program "Open Source" even if I don't use an approved license?
Please don't do that. If you call it "Open Source" without using an approved license, you will confuse people.

same question

Add in version 1.2.2
Enjoy!


[ENH] FeatureUnion refactor - moved to transformations, tags, dunder method

Work in progress.
This PR contains a refactor of FeatureUnion:

move to transformations.compose, deprecate series_as_feature occurrence
common refactor with TransformerPipeliene,  joint and duplicate methods moved to _HeterogeneousEnsembleEstimator
tag handling
+ dunder method for FeatureUnion

Depends on PR #1810 which is included.

Nice work! Are you running the test that was originally failing for FutureUnion ?

Nice work! Are you running the test that was originally failing for FutureUnion ?

Of course :-)

personally I would like to deprecate the whole module series_as_features, and this is a step to that.

Completely agreed, @TonyBagnall! It's a bit solitary and the "concern" it addresses is not entirely clear.
It does have some useful stuff, the other content being the splitters, which we should find a new home for first, though.


Refactor logical routines from core.pyx

Jenkins, test this please

CI was dead. Retry...
Jenkins, test this please

Jenkins CI test (for commit 7156c40685f9f187e82fa315ee3d4e99f1f282ac, target branch master) succeeded!


HARP-13055: Add individual TextElementStates for line markers

Signed-off-by: stefan.dachwitz<EMAIL_ADDRESS>Thank you for contributing to harp.gl!
Before requesting a pull request, please remember to check the following documents:

contribution guidelines
coding style

If you are adding new functionality we would highly appreciate if you can describe what is the capability you are adding and even better if you can add some examples. Please also remember to add tests for it.
CI Check
Our bots will check whether your PR can be directly integrated into the mainline. We have some internal integration tests running on the background, our bots will inform you of the next steps and someone from our team will take a look and help if needed!
And please do not forget to sign-off your commit! You can read more about DCO here. But, in short, you just need to use git commit -s or append --signoff when you are committing to the repo.
Happy contributing!

macbook tests please


Unexpected behaviour in finding Dockerfile

Required Information
Question, Bug, or Feature?
Type: Question or a bug
Enter Task Name:

Docker@2

Environment
Agent on custom build agents, running version 2.175.2 on Ubuntu 16.04
Issue Description
When providing the Dockerfile argument on a docker build task, it uses an incorrect pattern when including the $(System.DefaultWorkingDirectory) variable, causing the build to not find a pattern at all and not searching for the Dockerfile.
The task looked like this;
- task: Docker@2
  inputs:
    command: 'build'
    Dockerfile: '$(System.DefaultWorkingDirectory)/**/Dockerfile'

Also, when using the default pattern, it will find stuff in the Docker tmp directory, so I have to change this pattern I guess?
Task logs
logs.zip
Error logs
##[debug]Dockerfile=/appl/kwxbuild/agent/linux-agent-0004-1/_work/147/s
##[debug]No pattern found in Docker filepath parameter

Seems like this is due object parameters overwriting instead of merging.