Website Agent parsing issue

Hello. I'm trying to create the RSS feed with new eBay listings for specific item(s). The main problem is that Website Agent can't fetch all the image links. Here is my code:
{
  "expected_update_period_in_days": "1",
  "url": "http://www.ebay.com/sch/i.html?_from=R40&_sacat=0&_nkw=sansa+clip&_sop=10",
  "type": "html",
  "mode": "merge",
  "extract": {
    "imgurl": {
      "css": "#ListViewInner img.img",
      "value": "@src"
    },
    "url": {
      "css": "#ListViewInner a.vip",
      "value": "@href"
    },
    "title": {
      "css": "#ListViewInner img.img",
      "value": "@alt"
    }
  }
}

The output of the first 21 events is correct, for example:
> {
>     "imgurl": "http://thumbs.ebaystatic.com/images/g/v5QAAOSwQYZWuK~b/s-l225.jpg",
>     "url": "http://www.ebay.com/itm/SanDisk-SDMX11R-8192K-A70W-Sansa-Clip-8gb-Mp3-Player-Black-/272127974919?hash=item3f5c175e07:g:v5QAAOSwQYZWuK~b",
>     "title": "SanDisk SDMX11R-8192K-A70W Sansa Clip 8gb Mp3 Player [Black]"
> }

But the rest 29 events contain the same wrong image url:
{
    "imgurl": "http://ir.ebaystatic.com/pictures/aw/pics/s_1x2.gif",
    "url": "http://www.ebay.com/itm/SANDISK-SDMX18-008G-E46K-Sandisk-Sansa-Clip-8GB-MP3-Player-Colour-BLACK-/272127825246?hash=item3f5c15155e:g:y9wAAOSw~OVWuHuZ",
    "title": "SANDISK SDMX18-008G-E46K Sandisk Sansa Clip+ 8GB MP3 Player Colour BLACK ..."
}

I tried xpath instead of css, but the result is the same.

Looks like maybe you need "#ListViewInner li img.img", "#ListViewInner li a.vip", etc. so it matches each li and not the whole ul?  I'd also suggest trying SelectorGadget and seeing if it helps.  If not, let me know.

Nope, nothing has changed: 21 correct events and 29 events with a wrong image url. And with SelectorGadget's selectors (just a plain .img and .vip) I get an error "Got an uneven number of matches".

Do some posts not have images in the page?  One current issue is that the website agent can only scrape regular structures (see #990).
.imgWr2 .img and .vip both match 50 elements according to SelectorGadget, and so might work?

All listings have images. Anyway there's always a dummy image (for example: http://thumbs.ebaystatic.com/images/i/272155657052-0-1/s-l225.jpg).
I tried all the combinations of selectors, but without success. Then I tried http://webscraper.io and it scraped everything without any problems. The selectors were a.vip for titles, img.img for images and a.vip with href attribute for links. So I don't think it's a problem with selectors.
Also I've just noticed that Huginn scrapes data, which isn't on the page. I mean it scrapes a title and a link of the listing, but there's no such listing on the target page. At the same time it misses some listings that are on the target page.

Is it possible that the page is responding with different data for Huginn's user-agent string?  You might see if anything is better when setting user_agent in the WebsiteAgent to that of Chrome or Firefox.

I've changed user_agent and it fixed the problem with images. Thank you!
Still have an issue with missing listings though. Is there any way to debug Website Agent?

Glad it's fixed.  That's annoying of them.

Really sorry to touch on this thread as I'm pretty sure this isn't a bug but more user error. This is the closest to helping me solve my issues using WebsiteAgent to extract data from ebay searches. Since this thread in 2016 the ebay CSS selectors have changed, I'm using the following code (plus tried xpath with same results), verified the css selectors by both inspecting the HTML/CSS in chrome and using SelectorGadget but its eluding me how to resolve extracting the URL component. Would really appreciate any support or pointers.
Website agent code
{
  "debug": "true",
  "expected_update_period_in_days": "2",
  "user_agent": "Google Chrome",
  "url": "https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=ps4+or+%22playstation+4%22&_sacat=0",
  "type": "html",
  "mode": "on_change",
  "extract": {
    "title": {
      "css": ".s-item__title",
      "value": ".//text()"
    },
    "price": {
      "css": ".s-item__price",
      "value": "translate(., translate(.,'0123456789,.',''), '')"
    },
    "url": {
      "css": ".s-item__link",
      "value": "@href"
    }
  }
}

results in title and price being extracted correctly, but the url @href link extraction

throws errors, i.e
[00:00:00] INFO -- : Dry Run started
[00:00:00] INFO -- : Fetching https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=ps4+or+%22playstation+4%22&_sacat=0
[00:00:00] INFO -- : Extracting html at .s-item__title
[00:00:00] INFO -- : Values extracted: ["New Sony PlayStation 4 Slim 1TB or 2TB Black Gaming Console - PS4", "PlayStation 4 PS4 Video Game Shelf Display - Black or Dark Blue - Custom", "Dead or Alive 6 PS4 PlayStation 4", "NEW Sony PlayStation 4 Slim Marvel Spiderman Bundle PS4 Console 1TB or 2TB", "Dead or Alive 6 PS4 (Sony PlayStation 4, 2019)", "Death Stranding PlayStation 4 PS4 Pro Console (NO controller or game) NEW in box", "🔥Dead or Alive 6 (Sony PlayStation 4, 2019) PS4 Brand New Sealed Free Ship🔥", "Paw Patrol On A Roll (Playstation 4/PS4, 2018) ~ New/Sealed", "Dead or Alive 5: Last Round Sony Playstation 4 PS4", "DEAD OR ALIVE 6 Brand New Sealed PS4 Game PlayStation 4 USA Release DOA6", "Dead or Alive 6 PS4 (Sony PlayStation 4, 2019) Brand New - Region Free", "Borderlands 3 - PS4 Steelbook/Slip Cover ONLY (Playstation 4) *NO GAME OR CODES*", "Dead or Alive 6 PS4 (Sony PlayStation 4, 2019) sealed free shipping", "New ListingNew! NBA 2K19 PS4 PlayStation 4 or XBOX One BRAND NEW SEALED Merry Christmas!", "Dead Or Alive Xtreme 3 Fortune Normal PS4 Koei Tecmo Sony PlayStation 4 Japan", "PLAYSTATION 4 PS4 GAME DEAD OR ALIVE 5 LAST ROUND BRAND NEW AND SEALED", "Hotel Transylvania 3 Monsters Overboard USED SEALED Sony Playstation 4, 2018 PS4", "🔥Dead or Alive 6 (Sony PlayStation 4, 2019) PS4 Brand New Sealed Free Ship🔥", "New ListingThe Amazing Spider-Man 2 (Sony PlayStation 4, 2014) PS4 FREE SHIPPING", "Hotel Transylvania 3: Monsters Overboard PS4 (Sony PlayStation 4) ", "PS4 Dead or Alive 6: Core Fight -- Standard Edition (Sony PlayStation 4, 2019)", "Dead or Alive 6 PS4 Standard Edition Sony PlayStation 4, 2019, Brand New, Sealed", "Paw Patrol On A Roll (Playstation 4/PS4, 2018) ~ New/Sealed", "Dead or Alive 6 ( PS4/ PlayStation 4) BRAND NEW / Region Free", "Sony PlayStation 4 PS4 | Dead or Alive 5 Last Round | Complete In Box CIB", "Dead or Alive 6 PS4 (Sony PlayStation 4, 2019) - BRAND NEW FACTORY SEALED", "Nacon Revolution Unlimited PS4 Wired or Wireless Pro Controller Playstation 4", "🔥 Dead or Alive 6 (Sony PlayStation 4, 2019) PS4 Brand New Sealed Free Ship 🔥", "Dead or Alive 6 PS4 PlayStation 4 Brand New Sealed Free Fast Shipping", "Ben 10 PS4, New PlayStation 4, PlayStation 4 Factory Sealed Fast Shipping", "NEW DEAD OR ALIVE 6 PLAYSTATION 4 PS4 SEALED USA SELLER FAST FREE SHIPPING!", "Limited Run #274: Mercenary Kings Playstation 4 PS4 Ships in 24 Hours or less", "Astro Gaming C40 TR Wireless Or Wired Controller for Sony PlayStation 4 PS4", "Sony PlayStation 4 Slim or Pro - Customized - PS4 with up to 2TB HDD, SSHD, SSD", "PS4 DEAD OR SCHOOL JAPAN Sony PlayStation 4 Video Game Japan w/Tracking#", "Ben 10 PS4 New PlayStation 4, PlayStation 4", "4TB Death Stranding PlayStation 4 PS4 4 TB Console NEW (No Game Or Controller)", "New ListingDead or Alive 6 PS4 New PlayStation 4,PlayStation 4", "Playstation 4 / Xbox One lanyards with clip for keys or id badges,  key fob", "Destiny 2 for PS4 or Playstation 4 Pro Console Brand New Ships Fast Worldwide !!", "DEAD OR ALIVE 6 Steelbook NO GAME / PS4 Playstation 4 XBOX One", "PlayStation 4 (PS4) Dead Or Alive 5 Last Round", "Dead Or Alive 6 (Sony Playstation 4, 2019) NEW PS4", "SONY PlayStation 4 PS4 Game Console Black 1TB CUH-2200BB01 DHL or EMS Fast Ship", "Dead or Alive 6 Playstation 4 PS4 Fighting Video Game", "2TB Death Stranding PlayStation 4 PS4 Pro Console (NO controller or game) In box", "Nioh ps4 or playstation 4 ", "Dead or Alive 6 ( PS4/ PlayStation 4) BRAND NEW / Region Free", "Dead or Alive 5: Last Round (PS4, PlayStation 4, 2015)", "Dead or Alive 6 (Sony PlayStation 4, 2019) Brand New Sealed PS4", "Original Box Case Replacement Sony PlayStation 4 PS4 Dead or Alive 6 Six", "Dead or Alive 6 PS4 (Sony PlayStation 4, 2019) Brand New Sealed", "Playstation 4 PS4 Dead or Alive Xtreme 3 Fortune Chinese English Subtitle Import", "Dead or Alive 5 Last Round PS4 (Sony PlayStation 4, 2015) Brand New /Region Free", "Dead or Alive 6 PS4/ PlayStation 4 BRAND NEW INC Exclusive Pre Order DLC BONUS**", "DEAD OR SCHOOL PS4 playstation4 Sony JP", "NEW Playstation 4 XCOM 2 Aliens vs Humanity Strategy Video Game ~ PS4 or Xbox", "The Amazing Spider-Man 2 - Sony PlayStation 4 - PS4 *Free Shipping*", "The Amazing Spider-Man 2 (Sony PlayStation 4, 2014) PS4 NEW", "That's You (Sony PlayStation 4, 2017) PlayLink for PS4 Mobile or Tablet required"]
[00:00:00] INFO -- : Extracting html at .s-item__price
[00:00:00] INFO -- : Values extracted: ["299.99369.99", "12.00", "22.95", "339.99384.99", "17.99", "339.00", "21.99", "29.95", "14.39", "21.60", "24.99", "19.00", "22.99", "17.95", "55.00", "22.98", "15.95", "22.50", "8.90", "22.49", "16.00", "23.99", "17.99", "28.99", "33.95", "21.95", "20.00", "153.00", "21.99", "23.50", "25.99", "22.99", "62.99", "147.97", "490.001,795.00", "47.99", "30.39", "579.00", "65.19", "6.9912.99", "24.95", "11.95", "14.95", "59.99", "466.66", "27.99", "439.00", "25.00", "30.56", "22.99", "23.98", "4.99", "26.77", "99.99", "24.99", "74.99", "53.09", "20.99", "29.00", "138.65", "18.99"]
[00:00:00] ERROR -- : Error when fetching url: Got an uneven number of matches for : {"title"=>{"css"=>".s-item__title", "value"=>".//text()"}, "price"=>{"css"=>".s-item__price", "value"=>"translate(., translate(.,'0123456789,.',''), '')"}, "url"=>{"css"=>".s-item__link", "value"=>"@href"}}
/home/huginn/huginn/app/models/agents/website_agent.rb:580:in `rescue in block in extract_each'
/home/huginn/huginn/app/models/agents/website_agent.rb:577:in `block in extract_each'
/home/huginn/huginn/app/models/agents/website_agent.rb:567:in `each'
/home/huginn/huginn/app/models/agents/website_agent.rb:567:in `each_with_object'
/home/huginn/huginn/app/models/agents/website_agent.rb:567:in `extract_each'
/home/huginn/huginn/app/models/agents/website_agent.rb:611:in `extract_xml'
/home/huginn/huginn/app/models/agents/website_agent.rb:440:in `handle_data'
/home/huginn/huginn/app/models/agents/website_agent.rb:404:in `block in check_url'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/context.rb:123:in `stack'
/home/huginn/huginn/app/models/agents/website_agent.rb:401:in `check_url'
/home/huginn/huginn/app/models/agents/website_agent.rb:386:in `block in check_urls'
/home/huginn/huginn/app/models/agents/website_agent.rb:385:in `each'
/home/huginn/huginn/app/models/agents/website_agent.rb:385:in `check_urls'
/home/huginn/huginn/app/models/agents/website_agent.rb:379:in `check'
/home/huginn/huginn/app/concerns/sortable_events.rb:92:in `check'
/home/huginn/huginn/app/concerns/dry_runnable.rb:31:in `dry_run!'
/home/huginn/huginn/app/controllers/agents/dry_runs_controller.rb:41:in `create'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/abstract_controller/base.rb:194:in `process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/rendering.rb:30:in `process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/callbacks.rb:132:in `run_callbacks'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/abstract_controller/callbacks.rb:41:in `process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/rescue.rb:22:in `process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/notifications.rb:168:in `block in instrument'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/notifications.rb:168:in `instrument'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activerecord-<IP_ADDRESS>/lib/active_record/railties/controller_runtime.rb:24:in `process_action'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/abstract_controller/base.rb:134:in `process'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionview-<IP_ADDRESS>/lib/action_view/rendering.rb:32:in `process'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal.rb:191:in `dispatch'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal.rb:252:in `dispatch'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/routing/route_set.rb:52:in `dispatch'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/routing/route_set.rb:34:in `serve'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/journey/router.rb:52:in `block in serve'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/journey/router.rb:35:in `each'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/journey/router.rb:35:in `serve'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/routing/route_set.rb:840:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/warden-1.2.8/lib/warden/manager.rb:36:in `block in call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/warden-1.2.8/lib/warden/manager.rb:34:in `catch'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/warden-1.2.8/lib/warden/manager.rb:34:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/tempfile_reaper.rb:15:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/etag.rb:25:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/conditional_get.rb:38:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/head.rb:12:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/http/content_security_policy.rb:18:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/session/abstract/id.rb:232:in `context'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/session/abstract/id.rb:226:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/cookies.rb:670:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/callbacks.rb:98:in `run_callbacks'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/rack/logger.rb:38:in `call_app'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/rack/logger.rb:26:in `block in call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/tagged_logging.rb:71:in `block in tagged'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/tagged_logging.rb:28:in `tagged'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/tagged_logging.rb:71:in `tagged'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/rack/logger.rb:26:in `call'
/home/huginn/huginn/config/initializers/silence_worker_status_logger.rb:3:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/method_override.rb:22:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/runtime.rb:22:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/executor.rb:14:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/sendfile.rb:111:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/ssl.rb:74:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/engine.rb:524:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/railtie.rb:190:in `public_send'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/railtie.rb:190:in `method_missing'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/tempfile_reaper.rb:15:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/lint.rb:49:in `_call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/lint.rb:37:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/show_exceptions.rb:23:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/common_logger.rb:33:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/chunked.rb:54:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/rack-2.0.6/lib/rack/content_length.rb:15:in `call'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:562:in `process_client'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:658:in `worker_loop'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:508:in `spawn_missing_workers'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:132:in `start'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/bin/unicorn:126:in `<top (required)>'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/bin/unicorn:23:in `load'
/home/huginn/huginn/vendor/bundle/ruby/2.5.0/bin/unicorn:23:in `<top (required)>'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/cli/exec.rb:74:in `load'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/cli/exec.rb:74:in `kernel_load'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/cli.rb:463:in `exec'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/vendor/thor/lib/thor.rb:387:in `dispatch'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/cli.rb:27:in `dispatch'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/vendor/thor/lib/thor/base.rb:466:in `start'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/cli.rb:18:in `start'
/usr/local/lib/ruby/gems/2.5.0/gems/bundler-1.17.3/exe/bundle:30:in `block in <top (required)>'
/usr/local/lib/ruby/site_ruby/2.5.0/bundler/friendly_errors.rb:124:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.5.0/gems/bundler-1.17.3/exe/bundle:22:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
[00:00:00] INFO -- : Dry Run finished

thanks in advance for any help either solving, or directing me to info to help me solve my own problem.

@917huB  It looks like the problem is that for one listing the price selector is matching twice (selector gadget shows the count in the "clear" button. Shift clicking allows you to exclude an element. It gave me this selector for the price: .s-item__detail--primary:nth-child(1) .s-item__price

@dsander thank you, I had misunderstood how the error applied to my code.
For anyone else wanting to use Huginn to monitor ebay sales this is my final agent
{   "expected_update_period_in_days": "2",   "url": "https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=ps4+or+%22playstation+4%22&_sacat=0",   "type": "html",   "mode": "on_change",   "extract": {     "title": {       "css": ".s-item__title",       "value": ".//text()"     },     "price": {       "css": ".s-item__detail--primary:nth-child(1) .s-item__price",       "value": ".//text()"     },     "url": {       "css": ".s-item__link",       "value": "@href"     }   } }
This keeps the price line correct as well including when in a range, i.e "$299.99 - $369.99" isn't translated to "299.99369.99".

Me again! 😄 Sorry. Something broke again with the extraction now returning an empty line as the first entry in the .s-item__title which causes an uneven number of extractions. Is there a way to filter this erroneous line?
[00:00:00] INFO -- : Dry Run started [00:00:00] INFO -- : Fetching https://www.ebay.com/sch/1245/i.html?_nkw=ps5 [00:00:01] INFO -- : Extracting html at .s-item__title [00:00:01] INFO -- : Values extracted: ["", "Sony Playstation 5 Console Standard Disc PS5 - FREE SHIPPING - SHIPS TODAY", "PS5 Sony PlayStation 5 Edition Console Digital Version - NEW SHIP FAST 🚛💨⚡🔥", "PS5 Playstation 5 Console Disc Version Sony 🔥BRAND NEW ✈ IN HAND/SHIPS FAST", "PS5- Sony PlayStation 5 Console Disc Version - SHIPS IMMEDIATELY", "Sony PlayStation 5 Digital Console PS5 White BRAND NEW IN HAND SHIPS TODAY", "Sony PlayStation 5 Digital Edition Console Bundle IN HAND Ships FAST ✈🔥", "Brand New Unopened Sony PlayStation 5 PS5 Console Disc Version - IN HAND", "Sony PlayStation 5 Console PS5 Standard Disc Version Brand *NEW* FAST SHIP ✈", "Sony Playstation 5 PS5 Disc Version ***In Hand & Ready To Ship*** 🚚 NEW IN BOX!", "Sony PS5 Blu-Ray Edition Console - White", "Brand New Unopened Sony PlayStation 5 PS5 Console Digital Edition - IN HAND", "Sony PS5 Digital Edition Console --- (Digital/ No Disk)  Ships Same Day 🚒💨", "Sony PlayStation 5 Console Disc Version PS5 BRAND NEW IN HAND SHIPS FREE TODAY", "NEW Sony PlayStation 5 PS5 Console Disc Version ✅ IN HAND 📦 SHIPS FREE", "Sony PS5 PlayStation 5 Digital Game Console FAST SHIPPING SAME DAY ✅", "Sony Playstation (PS5) Disc/Blu-Ray Edition Console - White - Brand New *SEALED*", "RESTOCK SALE! SONY PLAYSTATION 5 PS5 DISC BLU RAY CONSOLE OR DIGITAL BUNDLE", "Sony PS5 Digital Edition Console - White (In Hand)", "PlayStation 5 Console - PS5 Disc Edition New IN HAND & SEALED!!", "Sony PS5 Digital Edition Console - White", "🔥 Sony PlayStation 5 PS5 DIGITAL EDITION VERSION CONSOLE IN HAND🔥 SHIPS FAST🔥", "Sony PlayStation 5 - PS5 Disc Console Brand New Ships TODAY ", "Sony PlayStation 5 PS5 Disc Version Console In Hand SHIPS WITHIN 1 BUSINESS DAY!", "IN HAND - Playstation 5 PS5 Disc OR Digital - Ships from US Seller", "Sony PS5 Blu-Ray Edition Console Bundle With Audeze Penrose X", "Sony PS5 Disc Edition Console White BRAND NEW, SEALED, SHIPS SAME DAY", "Sony PS5 Disc Edition Version Console - White - PlayStation 5 - SHIP FAST NEW!", "Sony PS5 Disc Edition - Brand New Sealed - Fast Shipping", "PlayStation 5 Console Standard Disc Version PS5 Brand NEW ", "SONY PLAYSTATION 5 PS5 DISC VERSION - FREE SHIPPING - BRAND NEW - SHIPS TODAY", "Sony PS5 PlayStation 5 Blu-Ray Disc Game Console NEW FAST SHIPPING SAME DAY!✅", "Sony Playstation 5 PS5 Digital Edition *Brand New*", "Sony PlayStation 5 PS5 DIGITAL EDITION CONSOLE DISC FREE - TRUSTED SELLER ✅", "Sony PS5 Blu-Ray Edition Console - White", "NEW & SEALED SONY PLAYSTATION 5 PS5 DIGITAL EDITION CONSOLE IN HAND SHIPS FAST!", "🔥🔥Sony PS5 Digital Edition Console! NEW!! SEALED! IN HAND!!🔥🔥", "Sony PlayStation 5 PS5 Digital Edition Console Brand New🔥🔥 In Hand!", "*Brand New* *Fast Shipping* Sony PS5 Blu-Ray Disc Edition Console - White", "Sony PS5 Blu-Ray Edition Console - White", "Sony PlayStation 5 Console PS5 DIGITAL Edition - BRAND NEW - FREE SHIPPING", "*Sealed BNIB PS5 Disc - Sony PS5 Blu-Ray Edition Consoles", "Sony PS5 Disc Edition Console - Sealed Brand New", "Sony Playstation 5 PS5 Disc Edition Console - White Brand New IN HAND SHIP Fast", "Sony PS5 Digital Edition Console - White *SEALED*", "Sony PS5 Blu-Ray Edition Console White NEW, FAST SHIPPING ⏰🔥🔥", "New Sony PlayStation 5 PS5 DIGITAL EDITION CONSOLE IN HAND - SHIPS FAST", "sony playstation 5 ps5 console new disc version", "Sony PS5 PlayStation 5 Blu-Ray Disc Edition✅BRAND NEW IN HAND SHIPS IMMEDIATELY✅", "Sony PlayStation 5 (PS5 Disc Edition) console - Brand New w/ extra controller", "Brand New Sony PlayStation 5 Disk Console PS5 (WILL SHIP ASAP)"] [00:00:01] INFO -- : Extracting html at .s-item__detail--primary:nth-child(1) .s-item__price [00:00:01] INFO -- : Values extracted: ["$929.95", "$799.95", "$810.00", "$745.00", "$719.99", "$999.00", "$781.00", "$799.00", "$949.95", "$690.00", "$660.00", "$710.00", "$789.00", "$1,299.95", "$718.88", "$690.00", "$64.99 to $799.99", "$800.00", "$800.00", "$700.00", "$799.95", "$849.95", "$760.00", "$740.00 to $780.00", "$950.00", "$770.00", "$789.00", "$710.00", "$797.97", "$999.99", "$798.88", "$799.99", "$815.00", "$749.99", "$729.99", "$610.00", "$725.00", "$680.00", "$749.99", "$800.00", "$770.00", "$670.00", "$745.00", "$680.00", "$1,000.00", "$699.99", "$710.00", "$650.00", "$790.00", "$800.00"] [00:00:01] ERROR -- : Error when fetching url: Got an uneven number of matches for : {"title"=>{"css"=>".s-item__title", "value"=>"text()"}, "price"=>{"css"=>".s-item__detail--primary:nth-child(1) .s-item__price", "value"=>".//text()"}, "url"=>{"css"=>".s-item__link", "value"=>"@href"}} /app/app/models/agents/website_agent.rb:580:in rescue in block in extract_each'
/app/app/models/agents/website_agent.rb:577:in block in extract_each' /app/app/models/agents/website_agent.rb:567:in each'
/app/app/models/agents/website_agent.rb:567:in each_with_object' /app/app/models/agents/website_agent.rb:567:in extract_each'
/app/app/models/agents/website_agent.rb:611:in extract_xml' /app/app/models/agents/website_agent.rb:440:in handle_data'
/app/app/models/agents/website_agent.rb:404:in block in check_url' /app/vendor/bundle/ruby/2.5.0/gems/liquid-4.0.3/lib/liquid/context.rb:123:in stack'
/app/app/models/agents/website_agent.rb:401:in check_url' /app/app/models/agents/website_agent.rb:386:in block in check_urls'
/app/app/models/agents/website_agent.rb:385:in each' /app/app/models/agents/website_agent.rb:385:in check_urls'
/app/app/models/agents/website_agent.rb:379:in check' /app/app/concerns/sortable_events.rb:92:in check'
/app/app/concerns/dry_runnable.rb:31:in dry_run!' /app/app/controllers/agents/dry_runs_controller.rb:41:in create'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/basic_implicit_render.rb:6:in send_action' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/abstract_controller/base.rb:195:in process_action'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/rendering.rb:30:in process_action' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/abstract_controller/callbacks.rb:42:in block in process_action'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/callbacks.rb:135:in run_callbacks' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/abstract_controller/callbacks.rb:41:in process_action'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/rescue.rb:22:in process_action' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/instrumentation.rb:33:in block in process_action'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/notifications.rb:180:in block in instrument' /app/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/notifications/instrumenter.rb:24:in instrument'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/notifications.rb:180:in instrument' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/instrumentation.rb:32:in process_action'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal/params_wrapper.rb:245:in process_action' /app/vendor/bundle/ruby/2.5.0/gems/activerecord-<IP_ADDRESS>/lib/active_record/railties/controller_runtime.rb:27:in process_action'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/abstract_controller/base.rb:136:in process' /app/vendor/bundle/ruby/2.5.0/gems/actionview-<IP_ADDRESS>/lib/action_view/rendering.rb:39:in process'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal.rb:190:in dispatch' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_controller/metal.rb:254:in dispatch'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/routing/route_set.rb:50:in dispatch' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/routing/route_set.rb:33:in serve'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/journey/router.rb:49:in block in serve' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/journey/router.rb:32:in each'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/journey/router.rb:32:in serve' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/routing/route_set.rb:834:in call'
/app/vendor/bundle/ruby/2.5.0/gems/warden-1.2.8/lib/warden/manager.rb:36:in block in call' /app/vendor/bundle/ruby/2.5.0/gems/warden-1.2.8/lib/warden/manager.rb:34:in catch'
/app/vendor/bundle/ruby/2.5.0/gems/warden-1.2.8/lib/warden/manager.rb:34:in call' /app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/tempfile_reaper.rb:15:in call'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/etag.rb:27:in call' /app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/conditional_get.rb:40:in call'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/head.rb:12:in call' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/http/content_security_policy.rb:18:in call'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/session/abstract/id.rb:266:in context' /app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/session/abstract/id.rb:260:in call'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/cookies.rb:648:in call' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/callbacks.rb:27:in block in call'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/callbacks.rb:101:in run_callbacks' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/callbacks.rb:26:in call'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in call' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/debug_exceptions.rb:32:in call'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/show_exceptions.rb:33:in call' /app/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/rack/logger.rb:37:in call_app'
/app/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/rack/logger.rb:26:in block in call' /app/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/tagged_logging.rb:80:in block in tagged'
/app/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/tagged_logging.rb:28:in tagged' /app/vendor/bundle/ruby/2.5.0/gems/activesupport-<IP_ADDRESS>/lib/active_support/tagged_logging.rb:80:in tagged'
/app/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/rack/logger.rb:26:in call' /app/config/initializers/silence_worker_status_logger.rb:3:in call'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/remote_ip.rb:81:in call' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/request_id.rb:27:in call'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/method_override.rb:24:in call' /app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/runtime.rb:22:in call'
/app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/executor.rb:14:in call' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/static.rb:126:in call'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/sendfile.rb:110:in call' /app/vendor/bundle/ruby/2.5.0/gems/actionpack-<IP_ADDRESS>/lib/action_dispatch/middleware/host_authorization.rb:76:in call'
/app/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/engine.rb:527:in call' /app/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/railtie.rb:190:in public_send'
/app/vendor/bundle/ruby/2.5.0/gems/railties-<IP_ADDRESS>/lib/rails/railtie.rb:190:in method_missing' /app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/tempfile_reaper.rb:15:in call'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/lint.rb:50:in _call' /app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/lint.rb:38:in call'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/show_exceptions.rb:23:in call' /app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/common_logger.rb:38:in call'
/app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/chunked.rb:98:in call' /app/vendor/bundle/ruby/2.5.0/gems/rack-2.2.2/lib/rack/content_length.rb:17:in call'
/app/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:562:in process_client' /app/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:658:in worker_loop'
/app/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:508:in spawn_missing_workers' /app/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:132:in start'
/app/vendor/bundle/ruby/2.5.0/gems/unicorn-5.1.0/bin/unicorn:126:in <top (required)>' /app/vendor/bundle/ruby/2.5.0/bin/unicorn:23:in load'
/app/vendor/bundle/ruby/2.5.0/bin/unicorn:23:in <main>' [00:00:01] INFO -- : Dry Run finished


Add speed text label to audio player

What
Some people won't understand what 0.5x 1x 1.5x means on the audio player
Where
Speed controls on the audio player
TODO

[x] Improve labels of play/mute buttons to provide context
[ ] Label the speed controls
[ ] Is there any data analytics on which speeds are used

Background
From the Hassell Inclusion accessibility audit August 2023.
Dovetail: https://proficient-wallaby-dpwd.dovetailapp.com/insights/Audio-player-needs-more-helpful-context-7sF0WDcG3wVWrpb4ATEQXS
Miro board: https://miro.com/app/board/uXjVMjsL5YE=/

Audio player labels were updated in #10312

For the two other checkboxes:
There is not much space to add a "Speed" label, which is why we want to check the analytics and consider removing one of the speeds. This is for when the Audio player is small, which happens in Exhibition Guides

Another problem we have with this page is that audio players can now have transcripts in a collapsible section underneath them, which would look terrible in this context.
There is also a need to review Exhibition Guides with Editorial as they find it very difficult to work with.
All this to say that there is quite a wider issue for audio players that needs to be figured out, and that it might link up with whatever gets done with Exhibition Guides. So we suggest we move this ticket back to the Backlog and address it after the Ex Guides discovery.

This isn't hugely useful at this point, but FYI found the analytics info on this while looking for something else!


added msrv

Updated MSRV to 1.67.1

Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:

Comparison is base (5e32e07) 100.00% compared to head (63eb76b) 100.00%.

Additional details and impacted files
@@            Coverage Diff            @@
##            master        #6   +/-   ##
=========================================
  Coverage   100.00%   100.00%
=========================================
  Files            2         2
  Lines           66        66
=========================================
  Hits            66        66

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


corporate: Add required plan tier option for discounts.

Adds the ability to set a required plan tier for a customer's default discount. Currently, only implements this support admin action for remote servers and realms.
Notes:

When a discount is added to a customer, the flat $20 a month discount for the first year is no longer an option / available for that billing entity. We could add a note/warning in the support view about this if we want to highlight it. In general, the expectation is that these very specific discounts for particular organizations will be decided after a support conversation, so the loss of the first year, flat discount won't likely be an issue in practice.

Screenshots and screen captures:

Error message for setting required plan tier for discount with active plan

All screenshots below show the support view action with success message and then the two remote plan options with the current support state.

Set default discount to 90% - appears on all plan pages

Set required plan tier to Basic - 90% discount no longer on Business page

Set required plan tier to Business - 90% discount no longer on Basic page

Set minimum licenses to 100 - appears on all plan pages

Set required plan tier to None - 90% discount on all plan pages & min licenses still 100

Self-review checklist

[ ] Self-reviewed the changes for clarity and maintainability
(variable names, code reuse, readability, etc.).

Communicate decisions, questions, and potential concerns.

[ ] Explains differences from previous plans (e.g., issue description).
[ ] Highlights technical choices and bugs encountered.
[ ] Calls out remaining decisions and concerns.
[ ] Automated tests verify logic where appropriate.

Individual commits are ready for review (see commit discipline).

[ ] Each commit is a coherent idea.
[ ] Commit message(s) explain reasoning and motivation for changes.

Completed manual review and testing of the following:

[ ] Visual appearance of the changes.
[ ] Responsiveness and internationalization.
[ ] Strings and tooltips.
[ ] End-to-end functionality of buttons, interactions and flows.
[ ] Corner cases, error conditions, and easily imagined bugs.

Screenshots look good to me!

Updates:

The new field on the Customer model is required_plan_tier as the plan is to use it both for plan percentage discounts and fixed rate plans.
For percentage discounts, this is only checked when we are creating a new plan. For changes to existing plans that end users can make (e.g. change billing schedule), we want to use the discount that was already applied to the existing plan.
Setting this via the support view does not require a customer default discount to already be set, so that we can use this for both discounts and flat rates.
Added some notes to the support view to remind/alert admins how changing the plan tier or discount will impact existing plans. These are just formatted as italics in this iteration, but we can add some nicer formatting via CSS.

Updated screenshots:
There is no longer an error in the support view when a required plan tier is added to a billing entity with a current or scheduled plan.

Upgrade scheduled for Business - setting required plan tier to Basic - no change to scheduled plan or billing information for user
![Screenshot from 2024-01-11 19-44-45](https://github.com/zulip/zulip/assets/63245456/5fc9c9ea-c2ee-4d64-b37b-8a819a1a2665)

Changing the discount does update the scheduled upgrade to Business plan

Series of screenshots for changing required plan tier / discount / min licenses for billing entity with no plan

Set required plan tier - no visible changes to upgrade billing pages

Set discount to Basic - appears on that plan billing page - flat-rate discount removed from Business

Add min licenses - on both pages

Change required tier to Business - discount now only on that billing upgrade page

Remove required plan tier - discount on both pages

lgtm aside from the comments above, thanks for all the work on this.

Updates:

Added a prep commit to simplify the audit log additions for changing a property on a Customer or CustomerPlan object.
Addressed review feedback; see comments above.

Updated hints for discount and required plan tier support form

Made the tweak suggested in https://github.com/zulip/zulip/pull/28521#discussion_r1451029215 and marked this to merge once CI passes. Thanks for all the work on this @laurynmm!

This needs tests fixed for my tweak (only ran test-backend corporate/ locally) and also a migration renumbering.

Update:

Renumbered migration
Fixed test for audit log change


Adding message for an unsupported second ingress controller

Adding message for an unsupported second ingress controller, followup from https://coreos.slack.com/archives/CCX9DB894/p1619516683014000

/lgtm


Quests Is Reporting An Issue. I Will Put My Latest Log...

My server is paper spigot 1.16.2.
Im using Quests version 4.0.0
I just saw it was giving an error in the console. My server keeps crashing for an unknown reason so im checking all the errors from plugins to see if that is whats causing the crashes.
Other than that, the quests seem to be fine (i think) but there is some error i'd like to fix, thanks.
My log before crash...
https://pastebin.com/QSs2yp3r

Thanks for the report. First, your language file needs to be updated. You can do this manually, or just delete the /lang folder and let the plugin regenerate it.
Second, I see a number of errors with other plugins you should address, but as for Quests your quest IDs custom32-35 reference NPCs which do not exist (either Citizens didn't load it or the NPC was deleted). Either restore the NPCs or edit/delete the quests within the quests.yml file.


Convert payloads from generator to list

Solves the error of kombu.exceptions.EncodeError: Object of type 'generator' is not JSON serializable
I want to merge this change because of kombu serialization error when Google Analytics is enabled:
web            | kombu.exceptions.EncodeError: Object of type 'generator' is not JSON serializable
web            | UWSGI uwsgi "POST /dashboard/products/6/variants/add/ HTTP/1.1" 302 325 28ms [PID:137:Worker-1] [RSS:125MB]
web            | ERROR saleor.core.middleware Unable to update analytics [PID:128:uWSGIWorker2Core0]
web            | Traceback (most recent call last):
web            |   File "/usr/local/lib/python3.6/site-packages/kombu/serialization.py", line 50, in _reraise_errors
web            |     yield
web            |   File "/usr/local/lib/python3.6/site-packages/kombu/serialization.py", line 221, in dumps
web            |     payload = encoder(data)
web            |   File "/usr/local/lib/python3.6/site-packages/kombu/utils/json.py", line 69, in dumps
web            |     **dict(default_kwargs, **kwargs))
web            |   File "/usr/local/lib/python3.6/json/init.py", line 238, in dumps
web            |     **kw).encode(obj)
web            |   File "/usr/local/lib/python3.6/json/encoder.py", line 199, in encode
web            |     chunks = self.iterencode(o, _one_shot=True)
web            |   File "/usr/local/lib/python3.6/json/encoder.py", line 257, in iterencode
web            |     return _iterencode(o, 0)
web            |   File "/usr/local/lib/python3.6/site-packages/kombu/utils/json.py", line 59, in default
web            |     return super(JSONEncoder, self).default(o)
web            |   File "/usr/local/lib/python3.6/json/encoder.py", line 180, in default
web            |     o.class.name)
web            | TypeError: Object of type 'generator' is not JSON serializable

Screenshots

Pull Request Checklist

[ ] Privileged views and APIs are guarded by proper permission checks.
[ ] All visible strings are translated with proper context.
[ ] All data-formatting is locale-aware (dates, numbers, and so on).
[ ] Database queries are optimized and the number of queries is constant.
[ ] Database migration files are up to date.
[x] The changes are tested.
[ ] The code is documented (docstrings, project documentation).
[ ] GraphQL schema and type definitions are up to date.
[ ] Changes are mentioned in the changelog.

I'm seeing this issue
web_1                       | ERROR saleor.core.middleware Unable to update analytics [PID:16:uWSGIWorker3Core0]
web_1                       | Traceback (most recent call last):
web_1                       |   File "/usr/local/lib/python3.6/site-packages/kombu/serialization.py", line 50, in _reraise_errors
web_1                       |     yield
web_1                       |   File "/usr/local/lib/python3.6/site-packages/kombu/serialization.py", line 221, in dumps
web_1                       |     payload = encoder(data)
web_1                       |   File "/usr/local/lib/python3.6/site-packages/kombu/utils/json.py", line 69, in dumps
web_1                       |     **dict(default_kwargs, **kwargs))
web_1                       |   File "/usr/local/lib/python3.6/json/__init__.py", line 238, in dumps
web_1                       |     **kw).encode(obj)
web_1                       |   File "/usr/local/lib/python3.6/json/encoder.py", line 199, in encode
web_1                       |     chunks = self.iterencode(o, _one_shot=True)
web_1                       |   File "/usr/local/lib/python3.6/json/encoder.py", line 257, in iterencode
web_1                       |     return _iterencode(o, 0)
web_1                       |   File "/usr/local/lib/python3.6/site-packages/kombu/utils/json.py", line 59, in default
web_1                       |     return super(JSONEncoder, self).default(o)
web_1                       |   File "/usr/local/lib/python3.6/json/encoder.py", line 180, in default
web_1                       |     o.__class__.__name__)
web_1                       | TypeError: Object of type 'generator' is not JSON serializable

I have the same issue to after I deployed to beanstalk.
/var/log/eb-docker/containers/eb-current-app/eb-d5c249ad18da-stdouterr.log
-------------------------------------
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type generator is not JSON serializable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./saleor/core/middleware.py", line 27, in middleware
    client_id, path=path, language=language, headers=headers)
  File "./saleor/core/analytics.py", line 68, in report_view
    _report(client_id, payloads, extra_headers=extra_headers)
  File "./saleor/core/analytics.py", line 36, in _report
    **extra_data)
  File "/usr/local/lib/python3.7/site-packages/celery/app/task.py", line 427, in delay
    return self.apply_async(args, kwargs)
  File "/usr/local/lib/python3.7/site-packages/celery/app/task.py", line 544, in apply_async
    body, serializer,
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/local/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 54, in _reraise_errors
    reraise(wrapper, wrapper(exc), sys.exc_info()[2])
  File "/usr/local/lib/python3.7/site-packages/vine/five.py", line 194, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/local/lib/python3.7/site-packages/kombu/utils/json.py", line 69, in dumps
    **dict(default_kwargs, **kwargs))
  File "/usr/local/lib/python3.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python3.7/site-packages/kombu/utils/json.py", line 59, in default
    return super(JSONEncoder, self).default(o)
  File "/usr/local/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
kombu.exceptions.EncodeError: Object of type generator is not JSON serializable
ERROR saleor.core.middleware Unable to update analytics [PID:17:uWSGIWorker2Core0]
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/local/lib/python3.7/site-packages/kombu/utils/json.py", line 69, in dumps
    **dict(default_kwargs, **kwargs))
  File "/usr/local/lib/python3.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python3.7/site-packages/kombu/utils/json.py", line 59, in default
    return super(JSONEncoder, self).default(o)
  File "/usr/local/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type generator is not JSON serializable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./saleor/core/middleware.py", line 27, in middleware
    client_id, path=path, language=language, headers=headers)
  File "./saleor/core/analytics.py", line 68, in report_view
    _report(client_id, payloads, extra_headers=extra_headers)
  File "./saleor/core/analytics.py", line 36, in _report
    **extra_data)
  File "/usr/local/lib/python3.7/site-packages/celery/app/task.py", line 427, in delay
    return self.apply_async(args, kwargs)
  File "/usr/local/lib/python3.7/site-packages/celery/app/task.py", line 544, in apply_async
    body, serializer,
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/local/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 54, in _reraise_errors
    reraise(wrapper, wrapper(exc), sys.exc_info()[2])
  File "/usr/local/lib/python3.7/site-packages/vine/five.py", line 194, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/usr/local/lib/python3.7/site-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/local/lib/python3.7/site-packages/kombu/utils/json.py", line 69, in dumps
    **dict(default_kwargs, **kwargs))
  File "/usr/local/lib/python3.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python3.7/site-packages/kombu/utils/json.py", line 59, in default
    return super(JSONEncoder, self).default(o)
  File "/usr/local/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
kombu.exceptions.EncodeError: Object of type generator is not JSON serializable
UWSGI uwsgi "GET /de/cart/summary/ HTTP/1.1" 200 785 29ms [PID:17:Worker-2] [RSS:162MB]```

@maarcingebala I still need this patch, 3 of us have the issue now, this warrants further investigation.

I would recommend to open an issue with the steps to reproduce this so it can be investigated and properly tested.

Still reproduces for me as well. No specific steps to reproduce, simply enabled google_analytics (as it says here - https://saleor.readthedocs.io/en/latest/integrations/googleanalytics.html) middleware and open any page and boom, error described above appear upon sending task to celery.

Same issue here!

Is this caused by version or setting?
I'm seeing same error. I'm using python 3.6.7 version.
@maarcingebala @artopolisco

No idea, mirumee are convinced this bug isn't real despite the number of us reporting it here. Deploy a fresh instance onto a Digital Ocean Ubuntu Droplet and you will encounter this error. Still, I guess we must be imagining it.

We are facing the same issue - I was hoping to see eCommerce results in google analytics soon


make unionAll()'s call signature match union()

Consolidates the logic used by union() and unionAll(), allowing the two to be used interchangeably (which is the current behavior claimed by the docs).
This allows .unionAll() to be called on multiple subqueries (rather than having to repeatedly call .unionAll() for each one).
Additionally, this adds test-coverage for the undocumented wrap argument on .unionAll() (which  is already documented for .union()).

Before:
This was the only allowable call-signature (apart from a second undocumented wrap parameter):
qb.unionAll(subQuery);

If I wanted to write the .unionAll() equivalent of qb.union([sq1, sq2]), I would have needed to write something like:
[s1, sq2].reduce((qb, sq) => qb.unionAll(sq), qb);

After
Any valid call to .union() should now work with .unionAll()
qb.unionAll(sq1);
qb.unionAll(sq1, wrap);
qb.unionAll(sq1, sq2);
qb.unionAll(sq1, sq2, wrap);
qb.unionAll([sq1, sq2]);
qb.unionAll([sq1, sq2], wrap);

Fixes #3054

Thanks! I’ll check this in near future, with brief look only doc updates are missing...

Got it. I can write a separate PR in the other repo.

@schmod thanks, please add a link to that to this PR then, so that it is easy to track when doing release.

Documentation PR: https://github.com/knex/documentation/pull/180
Also updated this PR to use spread args instead of arguments.

I think something went really broken in that last change:
for example like this:
 6) Query Building Tests
       QueryBuilder
         multiple union alls:
      mysql: AssertionError: expected 'select * from `users` where `id` = ? union all  union all ' to deeply equal 'select * from `users` where `id` = ? union all select * from `users` where `id` = ? union all select * from `users` where `id` = ?'
      + expected - actual
      -select * from `users` where `id` = ? union all  union all
      +select * from `users` where `id` = ? union all select * from `users` where `id` = ? union all select * from `users` where `id` = ?

@elhigu My bad.  Just pushed a change that should have fixed it.
I'm still seeing a failure on the Node 8 and Oracle tests, but it looks like those are unrelated to this PR.

I restarted node 8 tests, since it looked like random fail.... will merge after those pass. Thanks!


subscription-registrySpec.js does not properly test removal of subscriptions on close

In test/subscription-registrySpec.js, under 'removes all subscriptions on socket.close':
socketWrapperA.socket.emit( 'close' );

should remove all subscriptions associated with this SocketWrapper. This does not happen, as there is no listener registered on SocketWrapper's 'close' event (which is emitted by the SocketWrapper.socket's 'close' event).
A better test (and a test that properly fails) is one making use of isLocalSubscriber:
subscriptionRegistry.isLocalSubscriber(socketWrapperA)

Using this check, the test properly fails (of course the actual functionality will also need to be fixed).
This is on branch v2.0

Blocks #436


Image not showing up in Deep-Dive Blogs

I was going through deep dives but had to go back to images folder twice to see manually what exactly it's about :)
Please fix this issue xd. Not a big one but actually affects user experience :)

@krypticmouse

@shuklaji28 I think you are viewing md files on github and not website
Here is the link to the docs website: https://dspy-docs.vercel.app/docs/deep-dive/teleprompter/signature-optimizer


Linked Server Usage with Rows and Columns Modules

At a minimum, the rows and columns modules need to be using RPC linked queries. These modules currently fail when attempting run on a linked server. May affect other modules

search module included in this


Add Gifcurry for Haskell

Hello, I want to add gifcurry to the list.
Gifcurry is amazing tool for making gif. Besides gui, gifcurry is also available in cli. Here is reason, from  its repo, why gifcurry is awesome:

@ekickx Thank you!


Not Working in ServerSide Rendering

I am facing an issue with using the library. I am using the seed project : https://github.com/reactGo/reactGo Actually my requirement is to show the preview of the blog post along with the preview image to the user when sharing the blog post in facebook or twitter. I need to set the og:title and other related tags for this and I need to do all this dynamically as my blog titles will change and the same page will render all the different blogs with different titles. I am using this seed project which supports serverside rendering. When I keep the static string values in title on this page: https://github.com/reactGo/reactGo/blob/master/app/pages/Vote.jsx   then I can see the title being applied also when I do 'view source' I see that title but when I keep the dynamic title pulling it from the store/state I can see the title applied when I do 'inspect element' also on the title of browser window but when I do a 'view source' of the page the title is not set and restores to default. Without this I am not able t to share the blog posts on facebook as it picks the default title and not the ones I set.

In reactGo you'll need to do a Helmet.rewind() where the tags are set for the server-side render.  Refer to the README for details.

Hi @cwelch5 actually I am using a seed project 'reactGo' which already uses Helmet.rewind() I don't think the problem is with Helmet library as it changes the title and the meta tags and I can see them changed when I 'inspect element' I have gone with other approach for now so can close this ticket.

@cwelch5 ReactGo is using helmet.rewind but it seems like the meta tags get updated after the first render which is why facebook doesnt pick the og:tags. Any workaround to that?

In latest version v5 on server-side Helmet.renderStatic() aliased to Helmet.rewind() for more clarity. rewind will be deprecated in the future.


[v7] TS automatic imports in VSCode default to wrong path

Bug Report
Current Behavior
When using operators in VSCode, the suggested import defaults to rxjs/dist/types/operators, failing in runtime.
This wasn't happening in v6, starts happening after upgrading to v7.
Expected behavior
VSCode imports from the correct rxjs/operators path
Reproduction

create a simple playground

mkdir rxjs-playground
cd rxjs-playground
npm init -y
npm i rxjs@next

open that folder in VSCode
create a file foo.ts

interval(1000).pipe( // Correctly suggests `import { interval } from 'rxjs'`
   map(v => v*2) // Doesn't suggest any valid import, that's fine - it used to do that. Manually import it from `rxjs/operators`
)

create a file bar.ts and type in:

interval(1000).pipe( // Correctly suggests `import { interval } from 'rxjs'`
   map(v => v*2) // Wrongly suggests `import { map } from 'rxjs/dist/types/operators'`
)

Environment

RxJS version: 7.0.0-beta.12
VSCode: 1.53.2
Node: 12.18.3
Typescript: 4.1.5

Additional context/Screenshots

Note that after correcting it to rxjs/operators it correctly suggests adding the import from the right place

This issue in TypeScript seems related: https://github.com/microsoft/TypeScript/issues/30472
I'm not really sure what the resolution to this is. If it's on our end, or if it's in your tsconfig.
@cartant @RyanCavanaugh any ideas?

@voliva do you have to same issues with RxJS 6.x?

One primary difference I see between 6.x and 7.x is in 6.x we have the CJS root and typings root right next to each other. Where they are not next to each other in 7.x:
6.x package.json:
{
"main": "./index.js",
"typings": "./index.d.ts",
"module": "./_esm5/index.js",
"es2015": "./_esm2015/index.js"
}

7.x package.json:
{
"main": "./dist/cjs/index.js",
"types": "./dist/types/index.d.ts",
"module": "./dist/esm5/index.js",
"es2015": "./dist/esm/index.js",
}

any ideas?

I suppose we could also try renaming dist to a name that sorts last alphabetically and just hope that tools stumble across oprerators, etc., first.

I suppose we could also try renaming dist to a name that sorts last alphabetically and just hope that tools stumble across oprerators, etc., first.

Haha... zzzzzzzzzzzzzzzzzzzdist.

FWIW: We do now have the exports set in our package.json.

This is now resolved in the latest 7.0.0-rc.1. From #6229

Strangely, in the rc.1 version, I get "error TS2307: Cannot find module 'rxjs' or its corresponding type declarations.".
I am using TypeScript 4.2.4 + VSCode 1.55.2.

While the applied fix did fix the issue in VS Code, it also broke tsc's ability to find the rxjs module at all. I have no idea how that is possible, but I'm reverting the fix and cutting rc2

Hi
I have the same issue when importing Subjects with<EMAIL_ADDRESS>The wrong import results in a runtime error. This works fine with rxjs 6.
As illustrated in the screenshot below I'm using the same version of VSCode for two Angular projects.
The rxjs 6 version works fine while the rxjs7 doesn't (so most likely it is not a VScode issue)
TypeScript: 4.2.4

Do you have any idea about this ?


x/sys/unix: add missing *linkat functions on linux.

linkat
readlinkat
symlinkat

supports are missing.

Should this issue be re-opened since the commit that closed it has been reverted?


"nix log ." completion yields shift error/warning

$ nix log .<tab>
_sep_parts:shift:127: shift count must be <= $#

(Completion does not proceed)
nix log ./ emits the same message but completion seems to work anyway.

System

nix-zsh-completions version:
0.3.7
ZSH version:
5.4.2
NIX_PATH:
nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels:allvm=/home/will/.nix-defexpr/channels/allvm

nix-info

system: "x86_64-linux"
host os: Linux 4.9.76, NixOS, 18.03.git.d4490ef (Impala)
multi-user?: yes
sandbox: yes
version: nix-env (Nix) 1.12dtz5853_4d8dfd7
channels(will): "allvm, unstable-18.03pre124015.f59a0f7f1a6"
channels(root): "nixos-18.03pre124947.33a4de2941d"
nixpkgs: /nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs

Completion trace

(renamed ".log" to make github happy)
nix-log-dot.log

Thanks! I hit this frequently, avoiding the error is much nicer :).
Will add an override to use this on my machines, thanks!


moving subscribe to componentDidMount

Hi, what do you think about moving the subscribe in the Connector's constructor into the componentDidMount method?
This way if you do any data fetching serverside, the views won't be subscribed to updates and setState won't get called which results in an error on the server because of the reconciler in React.

I don't know much about server rendering. Is this more correct? Sure we can do that.

NuclearJs does their mixin's subscription in componentDidMount.  Since on the server we don't want the components to get their setState called I think this is the right place to put the subscribe
I'm not sure what the clean way to do this is, I think you would need to provide a reference to context.redux, like this:
    constructor(props, context) {
      super(props, context);

      this.redux = context.redux;
      this.state = this.selectState(props, context);
    }

    componentDidMount() {
      this.unsubscribe = this.redux.subscribe(::this.handleChange);
    }

what do you think?

Follow https://github.com/gaearon/redux/pull/179


Support encoding linear half float images

As mentioned in discussion #143 and issue #268, it would be nice to be able to encode linear half float (16-bit float) images.
Passing a raw image with img.fmt=UHDR_IMG_FMT_64bppRGBAHalfFloat, img.ct=UHDR_CT_LINEAR, and intent=UHDR_HDR_IMG to the uhdr_enc_set_raw_image function currently (version 1.1.1) fails with 'unsupported input pixel format for hdr intent 4, expects one of {UHDR_IMG_FMT_24bppYCbCrP010, UHDR_IMG_FMT_32bppRGBA1010102}'.

concur, this would be very helpful to have 16-bit linear half float RGB support

Yes, would be good to have. I needed some format which can easily written by open source tools and used in my #292 RGB int 16+16+16, but RGBA float 16+16+16 or RGBA float 16+16+16+16 would also be fine for me.
Example to write it: magick infile.tif -depth 16 -define quantum:format=floating-point RGB:outfile.raw
Or for 16+16+16+16 with alpha channel use RGBA:outfile.raw.

Thank you!


Feature request: Allow customisation of confluence_page_generation_notice

I'd like to add my own warning / styling to the notice.

If the level of customization is a simple text replacement for the notice, I do not see any major issues to support this. For example, supporting either:
confluence_page_generation_notice = True
 (or)
confluence_page_generation_notice = 'My custom notice message.'

Although, complete styling is a bit tricky, as the styling now varies between which Confluence editor used, as there is a mix of translator/node building and template building (for index, search, etc. pages) that would need some tweaking.
If you would like a more detailed customization of the notice, maybe using a custom confluence_header_file instead would be best? This would allow you to generate any custom message, tags or styling support by the Confluence instance you are targeting.
If this is related to a translation capability (i.e. wanting to use a non-English message), we do accept translation for messages via Crowdin.
That all being said, if there is a customization ideas I missed, I'm open for any details describing the use case.

Thank you for the quick and thorough response.
The text-only option would be a nice bonus, and plenty for me. This is not translation-related.
I want to add a warning about inline comments getting wiped (#698, related) .

Initial implementation for this has been added in #930. Feel free to try it out using the following command:
pip install git+https://github.com/sphinx-contrib/confluencebuilder.git@support-custom-page-gen-notice

Amazingly fast - thank you @jdknight !

v2.5 is now available on PyPI -- marking as closed.


[Q] discontinuity passing through ip output on lo interface

Both tsps are running on the same server.
tsp1)
tsp -v -I srt --listener remote-ip:10021 -P continuity -O ip -l <IP_ADDRESS> <IP_ADDRESS>:1234
tsp2)
tsp -v -I ip -l <IP_ADDRESS> <IP_ADDRESS>:1234 -P continuity -O drop
What you can see in this is the first tsp has input srt and output ip/udp/multicast
The second tsp reads from ip/udp/multicast
The weird thing for me is that I am seeing some missing packets only on tsp2.
`

continuity: packet index: 44,079, PID: 0x0200, missing 5 packets
continuity: packet index: 44,088, PID: 0x0200, missing 6 packets
continuity: packet index: 44,093, PID: 0x0200, missing 5 packets
`

What can the issue be? Only thing that I can think of is if the kernel is dropping packets going to the lo interface - which seems weird.

Hi @barhom
Interesting. I agree that dropping UDP packets on the lo interface is unlikely, although still possible under heavy load.
To investigate the issue, I would recommend to save the TS content before and after the lo interface like this:
tsp -v -I ip -l <IP_ADDRESS> <IP_ADDRESS>:1234 -P continuity -O file f2.ts

and
tsp -v -I srt --listener remote-ip:10021 -P continuity -P file f1.ts-O ip -l <IP_ADDRESS> <IP_ADDRESS>:1234 --enforce-burst

Start the receiver first to make sure it will capture the TS from the beginning. Use --enforce-burst to make sure that all UDP datagrams contain exactly 7 packets. This will be easier to characterize the loss of UDP datagram.
When you see unexpected discontinuities, stop the sender first (Ctrl-C) and then the receiver. "Normally", the files f1.ts and f2.ts should be identical. Track differences using:
tscmp f1.ts f2.ts --continue --subset --verbose

If the differences are only missing packets in f2.ts, in chunks of 7 TS packets (or a multiple of 7), you can be sure that this is a loss of UDP datagrams. In that case, this becomes a system & network tuning issue/

Trying to do what you suggested generated the following,
In console output of receiver
* continuity: packet index: 776,713, PID: 0x0200, missing 6 packets
* continuity: packet index: 776,725, PID: 0x1010, missing 1 packets
* continuity: packet index: 776,727, PID: 0x0200, missing 15 packets
* continuity: packet index: 776,729, PID: 0x1010, missing 14 packets
* continuity: packet index: 776,735, PID: 0x0200, missing 11 packets
* continuity: packet index: 776,741, PID: 0x1010, missing 1 packets
* continuity: packet index: 789,103, PID: 0x0200, missing 6 packets
* continuity: packet index: 789,110, PID: 0x0200, missing 4 packets
* continuity: packet index: 789,118, PID: 0x0200, missing 6 packets
* continuity: packet index: 1,396,585, PID: 0x0200, missing 7 packets
* continuity: packet index: 1,396,591, PID: 0x0200, missing 4 packets
* continuity: packet index: 1,396,598, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,440,488, PID: 0x0200, missing 6 packets
* continuity: packet index: 1,440,495, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,440,502, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,453,620, PID: 0x0200, missing 6 packets
* continuity: packet index: 1,453,628, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,453,634, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,594,404, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,594,413, PID: 0x0200, missing 6 packets
* continuity: packet index: 1,594,418, PID: 0x0200, missing 5 packets
* continuity: packet index: 2,162,763, PID: 0x0200, missing 6 packets
* continuity: packet index: 2,162,770, PID: 0x0200, missing 5 packets
* continuity: packet index: 2,162,776, PID: 0x0200, missing 5 packets
*

tscmp,
tscmp f1.ts f2.ts --continue --subset --verbose
* Comparing f1.ts and f2.ts
* Packet 776,713, missing 7 packets in f2.ts
* Packet 2,511,509: file f1.ts is truncated
* Read 2,511,509 packets, found 1 differences, missing 7 packets in 1 holes
*

Now to try to understand this.
How come the console output of receiver showed many different missing packets but tscomp only showed 7packets?
What is happening in the kernel that its dropping packets?

here is some more debug;
f1.ts
tsp -v -I file f1.ts -P continuity -O drop
* file: initial input bitrate is 3,000,000 b/s
* continuity: packet index: 7, PID: 0x0200, missing 5 packets
* continuity: packet index: 14, PID: 0x1010, missing 1 packets
*

f2.ts
tsp -v -I file f2.ts -P continuity -O drop
* file: initial input bitrate is 3,000,000 b/s
* continuity: packet index: 7, PID: 0x0200, missing 5 packets
* continuity: packet index: 14, PID: 0x1010, missing 1 packets
* continuity: packet index: 776,713, PID: 0x0200, missing 6 packets
* continuity: packet index: 776,725, PID: 0x1010, missing 1 packets
* continuity: packet index: 776,727, PID: 0x0200, missing 15 packets
* continuity: packet index: 776,729, PID: 0x1010, missing 14 packets
* continuity: packet index: 776,735, PID: 0x0200, missing 11 packets
* continuity: packet index: 776,741, PID: 0x1010, missing 1 packets
* continuity: packet index: 789,103, PID: 0x0200, missing 6 packets
* continuity: packet index: 789,110, PID: 0x0200, missing 4 packets
* continuity: packet index: 789,118, PID: 0x0200, missing 6 packets
* continuity: packet index: 1,396,585, PID: 0x0200, missing 7 packets
* continuity: packet index: 1,396,591, PID: 0x0200, missing 4 packets
* continuity: packet index: 1,396,598, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,440,488, PID: 0x0200, missing 6 packets
* continuity: packet index: 1,440,495, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,440,502, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,453,620, PID: 0x0200, missing 6 packets
* continuity: packet index: 1,453,628, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,453,634, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,594,404, PID: 0x0200, missing 5 packets
* continuity: packet index: 1,594,413, PID: 0x0200, missing 6 packets
* continuity: packet index: 1,594,418, PID: 0x0200, missing 5 packets
* continuity: packet index: 2,162,763, PID: 0x0200, missing 6 packets
* continuity: packet index: 2,162,770, PID: 0x0200, missing 5 packets
* continuity: packet index: 2,162,776, PID: 0x0200, missing 5 packets
*

There are two things here.
First, if tscmp shows a hole of exactly 7 packets, then this is for sure one UDP datagram which was dropped. This is quite possible. The kernel does not drop packets, the sender or receiver miss them, usually based on short buffer size. Either use the option --buffer-size in the ip input plugin or tune the Linux kernel parameters for UDP. This is no longer a TSDuck question.
Second, more unexpected, is the inconsistency between the result of tscmp and the two analyses on files f1.ts and f2.ts. Please upload these two files on some file transfer site (wetransfer.com or equivalent) so that I can analyze them.

Hi @barhom
Thanks for the files. I just found the reason: This is a UDP datagram ordering issue in the kernel.
First, I requested the files because the tscmp output was inconsistent with the continuity analysis of the two files. Indeed, the two files exhibited a bug in tscmp. After fixing this bug, the comparison becomes:
$ tscmp --verbose --continue --subset f1.ts f2.ts
* Comparing f1.ts and f2.ts
* Packet 776,713, missing 7 packets in f2.ts
* Packet 2,511,509: file f1.ts is truncated
* Packet 776,734, missing 1,734,775 packets in f2.ts
* Read 2,511,509 packets, found 3 differences, missing 1,734,782 packets in 2 holes

With option --subset, we consider that the second file is a strict subset of the first one. This is useful to locate missing packets between the two ends of a communication link.
We see that there are 7 missing packets starting at offset 776,713, as you already found. However, we also see that all packets after offset 776,734 in f1.ts are missing in f2.ts, even though there are many packets in f2.ts.
That was the bug in tscmp: in --subset mode, the last "hole" was not reported when it extended up to the end of the file.
Here, we should probably consider that f2.ts is not a strict subset of f1.ts. In that case, tscmp is not able to resynchronize in f1.ts on the content of the next packet in f2.ts.
So, we have another hypothesis: UDP neither guarantees that all packets are delivered nor the order of packets. In our case, the UDP datagrams are maybe received in the wrong order. That may seem weird when there is only a direct link on the local interface through the kernel. However, let's check.
The packet from f2.ts that tscmp cannot resynchronize in f1.ts is at packet offset 776,727. The message says 776,734 but this is an offset in f1.ts and there were 7 missing packets previously in f2.ts, so we need to substract 7.
Let's dump that packet:
$ tsp -I file f2.ts --packet-offset 776,727 -P until --packets 1 | tsdump

* Packet 0
  ---- TS Header ----
  PID: 512 (0x0200), header size: 4, sync: 0x47
  Error: 0, unit start: 0, priority: 0
  Scrambling: 0, continuity counter: 3
  Adaptation field: no (0 bytes), payload: yes (184 bytes)
  ---- Full TS Packet Content ----
  47 02 00 13 15 4B 15 8A CC 7D 5A 5F 86 EB 56 04 12 52 72 A0 24 85 D3 C0
  BF DA 45 98 D9 3F 43 79 69 21 60 64 FD 76 68 E6 ED FC 68 6A FA 52 6D E9
  DC 1F 37 81 0B 65 2E 79 B2 E6 01 CD 68 C7 28 E0 09 5B DD 9D 62 7E 12 BB
  9C DC 1E 73 FD E1 A6 F0 06 13 08 1F 74 F7 B4 0D 7E 05 E9 8B 9F 0D 80 AF
  E9 AA A0 06 61 FF D3 60 66 61 B7 9D 5C 59 CD D7 6D 77 37 1F CC EA 03 3B
  1E 31 4F 21 B8 25 E8 63 7B 78 BE 1D 34 48 B9 98 6E D4 22 16 5C 92 76 71
  5B 34 EC 4E 56 C2 80 94 D9 A8 A1 A1 84 B0 22 AF 7A B3 28 17 9E 66 D3 C2
  76 CD 6A 9E 6B 88 A3 32 A5 09 8E 4D 1E 4F 96 A3 11 99 36 F2

Now, let's try to find a matching packet in f1.ts:
$ tsdump f1.ts | grep -B 8 '47 02 00 13 15 4B 15 8A CC 7D 5A 5F 86 EB 56 04 12 52 72 A0 24 85 D3 C0'

* Packet 776,713
  ---- TS Header ----
  PID: 512 (0x0200), header size: 4, sync: 0x47
  Error: 0, unit start: 0, priority: 0
  Scrambling: 0, continuity counter: 3
  Adaptation field: no (0 bytes), payload: yes (184 bytes)
  ---- Full TS Packet Content ----
  47 02 00 13 15 4B 15 8A CC 7D 5A 5F 86 EB 56 04 12 52 72 A0 24 85 D3 C0

We find the packet in f1.ts at offset 776,713, precisely where tscmp reported 7 missing TS packets, ie. one UDP datagram. So, we may conclude that the UDP datagrams where not received in the same order as sent.
To confirm this, we can see that the 7 TS packets at offset 776,713 in file f1.ts are found at offset 776,727 in f2.ts:
$ tsp -I file f1.ts --packet-offset 776,713 -P until --packets 7 -O file f1sub.ts
$ tsp -I file f2.ts --packet-offset 776,727 -P until --packets 7 -O file f2sub.ts
$ tscmp f1sub.ts f2sub.ts
$

So, the reported 7 missing packets at offset 776,713 were not missed. They were received 14 TS packets later, 2 UDP datagrams later. This kind of local reordering of the UDP datagrams occurs several times later in the file, exhibiting all the discontinuities you see.
I can guarantee that tsp uses a strictly sequential pipeline. TS packets are always processed and written in the same order as they were read.
As a conclusion, you cannot rely on your kernel to deliver UDP datagrams in the same order as they are sent. This is allowed by the UDP protocol, just a little bit surprising from a local interface.
Out of curiosity, which operating system do you use and which version?

@lelegard Thank you for going through all of this!

Out of curiosity, which operating system do you use and which version?
Debian 11 running in PXE booted environment (all in ram).

# cat /etc/debian_version
11.0
# uname -a
Linux ES10 5.10.0-8-amd64 #1 SMP Debian 5.10.46-4 (2021-08-03) x86_64 GNU/Linux

As a conclusion, you cannot rely on your kernel to deliver UDP datagrams in the same order as they are sent. This is allowed by the UDP protocol, just a little bit surprising from a local interface.

I see what you are saying here, but it sounds very surprising. Maybe you need to specify something to the kernel on your outgoing packets from the IP output plugin? This is only a wild guess.
Actually this particular server has about 1gbit/s of "lo" interface multicast traffic - and I haven't experienced this issue with other streams as far as I remember. I need to check again.
I've tried changing the UDP buffers in sysctl to little avail - I guess like you said, the datagrams arent lost they simply came in the wrong order.
Do you have any suggestion on what I should dive into to see how I can solve this issue?

Do you have any suggestion on what I should dive into to see how I can solve this issue?

Not really. I do not know if using multicast on lo interface is a good idea. In theory, this is completely useless since there is no routing and one single node on this "network". I thought that it was just a test to replicate a specific issue on lo interface for simplicity but when you mention 1 Gb/s of "lo" interface multicast traffic, I see that this is more systematic.
However, the datagram order is an generic UDP issue. It should not make any difference whether it is unicast or multicast. Normally. The implementation of multicast is sometimes surprising. You may check if the same multicast address or the same UDP port is used at the same time on the lo interface. If you routinely use a lot of traffic on lo, this could interfere.
This is just a matter of fact, we see UDP packets being sent in one order on lo and being received from time to time in a different order from the same lo interface. This is no longer a TSDuck issue, this is a Linux UDP multicast issue. If you find an explanation, please let us know here.

I tried something which is at least interesting,
On the same host run the following,
iperf3 -s

and
iperf3 -c <IP_ADDRESS> -u -b 100000000 -R -l 1316

If we have an issue with the kernel giving Out of Order packets iperf would have logged them as follows,
example:
iperf3: OUT OF ORDER - incoming packet = 537 and received packet = 538 AND SP = 4

Results sending a 100mbit UNICAST shows no out of order packets and 0 drops.

Does tsduck have a buffer where it can do reordering when reading from udp?

I suggest to try to use unicast on lo (ie. -O ip localhost:NNNN and -I ip NNNN). The processing of multicast has always exhibited strange behaviours on different operating systems. It may not change anything but it's worth a try.

I will try this - however this limits me from reading the unicast only by one "reader" afaik which is not something I would like to limit myself to.

I will try this - however this limits me from reading the unicast only by one "reader" afaik which is not something I would like to limit myself to.

I was never convinced of the reliability of multiple readers on the same machine for the same multicast address/port. In principle, it should work. But the beauty of UDP is that nothing is guaranteed, even worse with multicast and the reality is often disappointing. Specifically when working with Linux, macOS and Windows at the same time as I do with TSDuck. There is always one behaving in a strange way.
Again, this is a kernel and network issue, not a TSDuck issue, and I recommend to get help from more appropriate forums.

I suggest to try to use unicast on lo (ie. -O ip localhost:NNNN and -I ip NNNN). The processing of multicast has always exhibited strange behaviours on different operating systems. It may not change anything but it's worth a try.

I will try this - however this limits me from reading the unicast only by one "reader" afaik which is not something I would like to limit myself to.

Actually, you can use multiple readers without multicast by utilizing a localhost broadcast, since the tsduck ip plugin sets the SO_REUSEPORT option. I was not able to use <IP_ADDRESS> as the target IP directly with tsp (* Error: ip: error sending UDP message: Permission denied) but by piping the tsp output to socat this setup works fine for me:
$ tsp -I file input.ts -P regulate | socat - udp-datagram:<IP_ADDRESS>:10000,broadcast
$ tsp -I ip 10000 -P continuity -P bitrate_monitor -p 5 -O file output1.ts
$ tsp -I ip 10000 -P continuity -P bitrate_monitor -p 5 -O file output2.ts

I've found,

https://unix.stackexchange.com/questions/569682/retransmissions-out-of-order-packets-with-large-1-mb-writes-reads-w-tcp-soc
<EMAIL_ADDRESS>
That talks about my issues and it seems the way forward is to enable RPS
echo ffffffff,ffffffff,ffffffff,ffffffff > /sys/class/net/lo/queues/rx-0/rps_cpus
I'll give it a try and let you know if that solves everything


Remove deprecated UIGraphicsBeginImageContextWithOptions

As of iOS 17, UIGraphicsBeginImageContextWithOptions has been deprecated, and causes apps built with Xcode 15 to crash. The suggested fix is to use UIGraphicsImageRenderer, which this PR implements.

What's the earliest iOS version you need to support? The replacement has been available since iOS 10. Unfortunately I'm not experienced enough with iOS to implement a version check

Also, there are definitely at least a few other people experiencing crashes:
https://github.com/DylanVann/react-native-fast-image/issues/1010


added function to get  gesterstate dx and dy when swiped

onSwiping gives x,y values but when horizontalSwipe or verticalSwipe is false x or y value will be zero. So, to get swipe direction when horizontalSwipe or verticalSwipe is false I have created a function which returns dx and dy from gestureState in onPanResponderMove.

Please fix conflicts & remove console.log from the code.

It's been some time since I worked on this stuff. ls verify and merge the branch merge_gesterState_dx_dy


[BUG] Latest tag can't be downloaded

:latest tag can't be downloaded.
@AmruthPillai

Looking into it now, I messed something up in the GitHub Actions workflow probably.


No @timestamp when changed index name

Hi guys,
first of all thanks much for all the work on FluenD project.
Today I'm trying to deploy fluentd to kubernetes, to monitor logs and sending to Elasticsearch.
With default settings everything seems ok.
I need to change index name from logstash format to myname-write which is alias for real index myname-000001 and I do rollover over this.
I changed environment variables in my deployment
...
- name: FLUENT_ELASTICSEARCH_LOGSTASH_FORMAT
  value: "false"
- name: FLUENT_ELASTICSEARCH_LOGSTASH_INDEX_NAME
  value: "myname-write"
...

FluenD start to sending logs to correct index but without @timestamp field. Propably some problem with mapping ? I'm not sure.
I found no errors in logs.
Reason of this is I have multiple clusters, and I want to split them in multiple indices.

If you didn't change the setting of fluentd, I assume the ES side setting cause the problem.
elasticsearch plugin always set @timestamp by default.

Hi guys,
first of all thanks much for all the work on FluenD project.
Today I'm trying to deploy fluentd to kubernetes, to monitor logs and sending to Elasticsearch.
With default settings everything seems ok.
I need to change index name from logstash format to myname-write which is alias for real index myname-000001 and I do rollover over this.
I changed environment variables in my deployment
...
- name: FLUENT_ELASTICSEARCH_LOGSTASH_FORMAT
  value: "false"
- name: FLUENT_ELASTICSEARCH_LOGSTASH_INDEX_NAME
  value: "myname-write"
...

FluenD start to sending logs to correct index but without @timestamp field. Propably some problem with mapping ? I'm not sure.
I found no errors in logs.
Reason of this is I have multiple clusters, and I want to split them in multiple indices.

include_timestamp true can be used to add @timestamp field to the logs
https://github.com/uken/fluent-plugin-elasticsearch#include_timestamp

I am running into the same problem. Is it possible to include_timestamp as a environment variable in the deployment?
Also, I am wondering; With the "logstash_format true" the @timestamp get's added correctly, but I can't seem to get ILM, and rollover indexes working properly. Is there any reason to actually use logstash_format true, does anyone have index lifecycle policies working with this?

but I can't seem to get ILM and rollover indexes working properly. Is there any reason to actually use logstash_format true, does anyone have index lifecycle policies working with this setting set to true? I had to turn it off, and then define an index_name and use that as my index alias to get rolling indexes to work.

This seems to be a bug of fluent-plugin-elasticsearch. This issue has been fixed in https://github.com/uken/fluent-plugin-elasticsearch/pull/786.
And this patch is included in the latest debian-elasticsearch docker image tag: v1.11.1-debian-elasticsearch7-1.3 or v1-debian-elasticsearch.


How to Run without exiting on error?

Currently it appears that if a command returns an error, Run will exit the program, since it calls HandleExitCoder, which always exits if the error is not nil. Is it possible to receive that error without exiting? For instance, I've implemented an interactive console that uses this library - the console should not exit just because a command returned an error

@ebuchman agreed, we should support this use case. For now you can workaround it by setting cli.OsExiter = func(_ int) {}  to avoid exiting on error, but I'll mark this as an enhancement.

Perviously app.Run() would exit only if the command opted in to it by returning an error that implemented ExitCoder. Otherwise it would return that error to the caller for it to handle.
Now HandleExitCoder always exits if err != nil, meaning that app.Run() only ever returns nil.
It looks like an API change (added in f41708) and probably a bug to me, rather than something that needs an enhancement or hack to work around.

@wttw yeah, I took a deeper dive in and tend to agree with you that the original intent was to only exit if it satisfied ExitCoder (in #361 -- cc/ @meatballhat). It was later adjusted in #496 to satisfy #475, but, in hindsight, the recommendation there should have been to use RunAndExitOnError(). RunAndExitOnError was deprecated when ExitCoder was added, but I could see bringing it back as a convenience function for users who want that behavior, but don't want to wrap their errors in ExitCoders.
Long story short, I agree that this is a bug. We'll need to be careful about releasing this though, since some people may have started to depend on this behavior.

This is fixed by #595 -- thanks for raising it @ebuchman


Build rudimentary UI for Social kit's SLComposeViewController

The rudimentary UI should support posting text, URLs and images.

There's a rudimentary UI for the Social kit now. Most of the back-end network traffic still isn't hooked up yet.


Add Contributors Pannel

added Contributors section and  in the README file and also in table of content

you have requested to add top line to the best contributor section right.

[![Best Contributors](https://contrib.rocks/image?repo=warmachine028/memories)](https://github.com/warmachine028/uemcrp/graphs/contributors)

Suggested to add this line☝ below Best contributions Heading

ok give me a min

Please make sure to star this repo 🌟


initialValues in FormWizard do not work with FieldArray

Hello,
I hope I can explain my problem understandably. I wanted to use redux-form(wizard) for a shop cart.
At the beginning I dispatch the initialize action with the data for the cart, these looks like:
kitchens: [{"id": "2-1-1-1-5-9-2", "deliveryOption": "selfservice"},{"id": "2-1-6-1-5-9-2","deliveryOption": "selfservice"}]
In my Wizard I render the FieldArray with name "kitchens" but in this fields prop is always empty? I also tried to add an "Add-Button" where i use fields.push()?
Now an new Kitchen is added in values but also fields is empty.
Can somebody help me?
Here is a simply Overview of my code: https://jsbin.com/pawezu/33/edit?js,output

Hey I am facing the same issue..! were you able to resolve this?
After initializing, In my redux state:

initial shows the value that I initialized.
But values shows empty.

Hey yes my Problem was the form reducer. I initialized it as "formReducer" but the key for the store has to be "form". After I changed that it worked.
before:
combineReducers({
    formReducer
})

after:
combineReducers({
    form: formReducer
})

Hi @kaufmo - Yes I am using form: formReducer only. After initializing the FieldArray I had to use action arrayPush('fieldArrayName',{}) inside the componentDidMount.
Cool we can close this topic!! thanks though. Happy coding


Extension pack view makes actual readme content very small when the editor group is small

An extension pack has to be light weight and only contain extensions, it is not expected to be a feature rich extension and also have some goodies. I would recommend Jupyter extension to uncategorize it as extension pack

Sure, I agree. However there is still an issue here as extension packs also have descriptions. This is using my typical editor size:

This is worth than expected, it's not possible to read the description on small windows since the body doesn't have a scroll bar:


Bug: ansi.pink should use a non-hex code

It is cute that the library tries to provide a pink that is close to gleam's pink, but this colour is the only one in the lib that doesnt use standard ansi escape codes and thus breaks when rendered in some terminals ( e.g. macOS terminal)
based on concensus from other gleamlins in the discord, we should use ansi colour 219

looks like this was closed by #12!


Add option to control app from android_alam_manager

Use case
I am developing a simple alarm clock app which should show a certain screen when the alam plays so you can turn it off. Using the little hack in #30555 I was able to get the app to wake up the device and play music already but I am having trouble getting the app to change the screen (obviously; with the callback of the android_alarm_manager running in an isolate). With Isolate.current.controlPort I have the ability to send messages somewhere but apparently no chance of catching those messages in the running app to manipulate it.
I looked around for options on how to get access to the main isolate, tried using runApp (similar to #32617) in an attempt to get access to a new running app I could do my shenanigans in which failed once again due to the isolate issue.

Proposal
I am not sure in how feasible this is but I thought of something like a general / unified stream getting the data from the ReceiverPorts of the alarms created.
Using something like AndroidAlarmManager.callbackMessageStream.listen() on the app side would then allow reacting to message created in the callback through Isolate.current.controlPort.send().

I've been scratching my head to this problem for some time now and I'm glad you bring this up. I'd be grateful for any solutions or updates to this.

Heyo! Currently I am using a rather ugly polling mechanism for my usecase. I drop specific files into a directory when the alarm goes off (for example a file called 1.alarm when the alarm with the callback id 1 runs) and in the app I run a loop checking for *.alarm files in the main function (or optionally as life cycle listener when the app resumes). When such a file is found, I am then running the changes in the app and remove the file once I am done.
Same thing works the other way around (for example when you play a custom music file from the alarm callback), create a id.disable file or something like that, poll for that in the callback, stop the player (or do something else for your usecase) and delete the file.
However I sincerely hope that there will be an official API for this because this does not feel very good and creates a bit of boilerplate just for creating and looking up those files.

Well ok, this does not sound like a solution we should strive for. I'm starting to doubt if a solution would be meaningful at all - since the alarm callbacks are also supposed to be called when the app ends, what does it mean to have a main isolate then? Unfortunately I don't know enough about dart and isolates at this point to provide some meaningful input but I'll try to read up on this and come up with something.

Closing as android_alarm_manager is deprecated in favor of android_alarm_manager.


ERROR  Cannot start nuxt:  Cannot read properties of undefined (reading 'options')

Hey I just did what it has in the doc
yarn add nuxt-vue-select
then I added
modules: [     "nuxt-vue-select",   ],
in my nuxt config
but it doesn't work and has this issue :
`
ERROR  Cannot restart nuxt:  Cannot read properties of undefined (reading 'options')
at _default (node_modules/nuxt-vue-select/lib/module.js:11:13)
at installModule (node_modules/@nuxt/kit/dist/index.mjs:452:21)
at async initNuxt (node_modules/nuxt/dist/index.mjs:2476:7)
at async load (node_modules/nuxi/dist/chunks/dev.mjs:6824:9)
at async _applyPromised (node_modules/nuxi/dist/chunks/dev.mjs:6737:10)
`
package json:
{   "name": "hey",   "private": true,   "scripts": {     "build": "nuxt build",     "dev": "nuxt dev",     "generate": "nuxt generate",     "preview": "nuxt preview",     "postinstall": "nuxt prepare"   },   "devDependencies": {     "@vuelidate/core": "^2.0.2",     "@vuelidate/validators": "^2.0.2",     "autoprefixer": "^10.4.14",     "nuxt": "^3.3.2",     "postcss": "^8.4.21",     "sass": "^1.62.0",     "tailwindcss": "^3.2.7"   },   "dependencies": {     "@funken-studio/sitemap-nuxt-3": "^4.0.4",     "@nuxt/kit": "^3.3.2",     "click-outside-vue3": "^4.0.1",     "nuxt-jsonld": "^2.0.7",     "nuxt-vue-select": "^0.1.4",     "vue-i18n": "^9.2.2",     "vue-toastification": "next"   },   "packageManager"<EMAIL_ADDRESS>}
How can I solve it?

same

Same issue but it's
Cannot read properties of undefined (reading 'nuxt-vue-multiselect')
for me

how to fix it?

I have the same error here, but it looks like this repo is abandoned


Return pairs.tsv from CheckStateMachine

CheckStateMachine currently just returns the html in string format.
Would be programmatically easier to parse out the pairs.tsv output in string format and run queries on the output dataframe.
I tried rendering the HTML in databricks, it shows it but never stops adding onto the iframe size which makes a very strange output.

I have the actual somalier tsv outputs (pairs+) - so I can easily add a function that does a return of them..

There is a new 'relate' command that returns this


Reason: Filter truncate was called on an incorrect value: got null but expected a String #1

I have same issue, maybe you can fix it for your theme?
https://github.com/lukehsiao/zola-pickles/issues/1

Done. Check the latest commit https://github.com/oltdaniel/dose/commit/8a6d82da7f18b839fd4bc8160fb3b5f0488867de .

still happens. Problem in page.html

Check https://github.com/oltdaniel/dose/commit/1bf9a27a230846fe9d14167c5ca750ce549b1ce4 .

thank you!

You could've made a pull request as well. No magic behind an if statement.