mmv1,2 is also a very nice tool for such a task, applied to the current job, it would be mmv '*.md' 'test - #1.md'
- Jun 2021
-
superuser.com superuser.com
-
-
unix.stackexchange.com unix.stackexchange.com
-
In case writing to tmpfile fails for some reason, use && mv ... instead of ; mv ... -- that will keep $file from being overwritten with "bad" content.
-
-
-
stackoverflow.com stackoverflow.com
-
Different ways to prepend a line: (echo 'line to prepend';cat file)|sponge file sed -i '1iline to prepend' file # GNU sed -i '' $'1i\\\nline to prepend\n' file # BSD printf %s\\n 0a 'line to prepend' . w|ed -s file perl -pi -e 'print"line to prepend\n"if$.==1' file
-
-
devhints.io devhints.io
-
-
stackoverflow.com stackoverflow.com
-
From pretty format documentation: '%w([<w>[,<i1>[,<i2>]]])': switch line wrapping, like the -w option of git-shortlog[1]. And from shortlog: -w[<width>[,<indent1>[,<indent2>]]] Linewrap the output by wrapping each line at width. The first line of each entry is indented by indent1 spaces, and the second and subsequent lines are indented by indent2 spaces. width, indent1, and indent2 default to 76, 6 and 9 respectively. If width is 0 (zero) then indent the lines of the output without wrapping them.
-
-
-
Although h.265 was released almost 5 years ago, adoption is slow. The primary reason for this, is that unlike h.264 which has 1 patent pool, h.265 has 3 patent pools with different pricing structures and terms & conditions. The second patent pool (HEVC Advance) was introduced in 2015, 3 years after the launch. This unclarity about the royalties situation around h.265 was hindering the adoption and as a result primary browsers have no support at all (e.g. Chrome, Firefox) or only partial support (Edge). Due to this, many content providers have stuck with h.264 because at least they know it will always play.
patents
-
-
www.quora.com www.quora.com
-
Sort of. There are several systems around that have varying degrees of freedom. I have used Ivideon, which works fairly well as a docker-based environment, although it really needs its paid cloud back end to work well, and looked as Shinobi. If you are prepared to train your system, which can take some time, Shinobi is probably the best bet.
-
-
shinobi.video shinobi.video
-
-
"I am a huge fan of open source and am writing code myself. However Zoneminder is a mess. Been trying to use it for like 10 years. But it never worked reliably. More than 3 cameras almost always made it fail. RTSP never worked reliably. Shinobi took me minutes to set up on my mini PC and is feeling so reliable already. Reinventing the wheel may be bad. But let's face it: Zoneminder is doomed. The horse is dead. Let's get off."
.
-
I would suggest Shinobi as a NVR
Tags
Annotators
URL
-
-
selfhosted.show selfhosted.show
-
-
www.amazon.com www.amazon.com
-
100% customer satisfaction service, value for your money, any questions, do contact us for help! We are always here to help you out.
.
-
-
www.amazon.com www.amazon.com
-
It is NOT an alarm, but it does alert you!
What's the difference?
-
always bring a few when staying in hotels or Airbnb’s and such. Can be removed with ease and be installed within a minute or 2
.
-
-
www.amazon.com www.amazon.com
-
But after using it for a few days you quickly realize that there is one major privacy issue that has been installed consciously by Amazon and Ring.The ring app allows you to delete videos on the system but it does Not allow you to delete motion sensor and window sensor history.So Amazon/ring knows everything that happens inside your home and there is no way for you to delete that history. They know when you’re inside, they know when you open your door, they know when you closed it. etc. etc. etc. So they essentially know everything about you and your motions within your home.This is a major privacy issue. And it is not some mistake that was overlooked. This was a conscious choice on Amazon/rings part to track the motions of you and your family inside your own home.I spoke with the customer service rep from Ring and she admitted that many many people call up and complain that they can’t delete sensor history. Of course it would’ve been much more ethical to explain to potential customers BEFORE they buy ring products that this breach of privacy has been installed.But Amazon/ring does not warn their customers about this privacy breach. They don’t warn customers because they created the privacy breech and Will continue to have an always have very personal information on the motions of your family inside your own home.If you care about your privacy. Don’t buy Ring products.
-
Why bother? Well, you never know if some crook has a device that can hack into your garage door opener!
.
-
-
www.amazon.com www.amazon.com
-
What finally led me to write this review was that I recently received an offer containing 2 $20.00 gift cards to write a 5 star review. I wonder now if I had been duped by the reviews I read
-
I do not advise. I still do not understand where there are so many good reviews for this product. This vacuum cleaner is literally bursting at the seams.
-
Soliciting five star reviews earns a one star.
-
-
www.amazon.com www.amazon.com
-
I bought this mostly because of the outstanding reviews which now I question greatly and may never trust another review again.
-
-
stackoverflow.com stackoverflow.com
-
for cpp_file in *.cpp; do gcc -c $$cpp_file & done; wait This gives much finer control than make -j.
-
Note that & is a line terminator like ; (write command& not command&;).
-
-
There is one very important reason for enabling job control to be useful inside scripts: the side-effect it has of placing background processes in their own process groups. This makes it much, much easier to send signels to them and their children with one simple command: kill -<signal> -$pgid. All other ways of dealing with signaling entire trees of processes either involve elaborate (sometimes even recursive) functions, which are often bugnests, or risk killing the parent in the process (no pun intended).
-
You particular circumstances may or may not warrant a way different from what lhunath (and other users) deem "best practices".
-
Remember that in the end, especially in scripting, there always are more than one way to skin a cat, but some ways are more portable, more reliable, make it simpler to handle error cases, parse the output, etc.
Tags
- shell scripting
- command line: job control
- depends on whom you ask
- which is better depends on which criteria you use to judge
- shell scripting: killing/managing child processes
- best practices
- unintuitive
- more than one right way (no one right/best way)
- use case
- appropriate use case
- surprising behavior
- Linux: process groups
- shell scripting: job control
- easy to get wrong
Annotators
URL
-
-
-
-
Provides a template for future specific classes
-
Abstract classes offer default functionality for the subclasses.
-
-
english.stackexchange.com english.stackexchange.com
-
-
I hate mentee. The word is protégé.
-
'...ee' is usually paired with an '..er', isn't it? Employee/Employer, Trainee/Trainer. I wouldn't use Coachee because to me, it implies you're a Coacher, not a Coach.
Just because "...ee" is usually paired with an "...er" word doesn't mean it can never be paired with a non-"-er", non-"-or" word.
I'm sure there are many examples of inconsistencies in English that we could point at to make that point...
-
-
github.com github.com
-
In your pull request, could you please add the index_errors option to the documentation of the has_many association, and may be refer to it in the accepts_nested_attributes_for method? The option is nowhere documented accept for the Rails 5.0 update readme.
-
index_errors: true
index_errors: true
-
-
github.com github.com
-
Closing this PR since it's been sitting here for over 2 years. Can reopen if need be.
-
-
Happy Third Birthday #24728!
-
-
github.com github.com
-
-
As you can see Rails already adds error messages from associated models and doing it wrongly: Merging together errors from different models under same has_many association. :"employments.company"=>["can't be blank"] And this is wrong.
-
I have been waiting for a solution for this quite a while now.
-
-
github.com github.com
-
I wouldn't consider it switching behavior. Ultimately it's including a module -- either a manually defined and referenced one from the user, or a RSpec::Core::SharedExampleGroupModule created for the user when they defined the shared example group and referenced via the group name.
-
The first argument to shared_context (the shared group name) is superfluous. It feels a bit like "what's this argument for again?" (Note that you could still use it with include_context to include the group manually, but it's a bit odd to mix-and-match the approaches).
-
-
formidable.com formidable.com
-
When we use a GraphQL API there are two kinds of errors we may encounter: Network Errors and GraphQL Errors from the API. Since it's common to encounter either of them, there's a CombinedError class that can hold and abstract either.
-
-
en.wikipedia.org en.wikipedia.org
-
spec.graphql.org spec.graphql.orgGraphQL1
-
GraphQL services should not provide any additional entries to the error format since they could conflict with additional entries that may be added in future versions of this specification.
Tags
Annotators
URL
-
-
graphql-ruby.org graphql-ruby.org
-
This kind of error handling does express error state (either via HTTP 500 or by the top-level "errors" key), but it doesn’t take advantage of GraphQL’s type system and can only express one error at a time.
-
It works, but a stronger solution is to treat errors as data.
-
In mutations, when errors happen, the other fields may return nil. So, if those other fields have null: false, but they return nil, the GraphQL will panic and remove the whole mutation from the response, including the errors!
-
In order to have the rich error data, even when other fields are nil, those fields must have null: true so that the type system can be obeyed when errors happen.
-
-
Then, client apps can show the error messages to end users, so they might correct the right fields in a form, for example.
Tags
- limitations
- disadvantages/drawbacks/cons
- works for many (array) in addition to one (no arbitrary limitation)
- limitation: works for one but not many (array)
- typing
- GraphQL: mutation errors
- unintended consequence
- GraphQL: top-level errors
- unintentionally breaking something
- irony
- unfortunate limitations
- recoverable errors
- errors as data
- recoverable vs. non-recoverable errors
Annotators
URL
-
-
graphql-ruby.org graphql-ruby.org
-
In general, top-level errors should only be used for exceptional circumstances when a developer should be made aware that the system had some kind of problem. For example, the GraphQL specification says that when a non-null field returns nil, an error should be added to the "errors" key. This kind of error is not recoverable by the client. Instead, something on the server should be fixed to handle this case. When you want to notify a client some kind of recoverable issue, consider making error messages part of the schema, for example, as in mutation errors.
-
-
dictionary.cambridge.org dictionary.cambridge.org
-
non-surface-apparent opacity
-
-
graphql-ruby.org graphql-ruby.org
-
With GraphQL-Ruby, it’s possible to hide parts of your schema from some users. This isn’t exactly part of the GraphQL spec, but it’s roughly within the bounds of the spec.
-
(Always call super to inherit the default behavior.)
-
-
graphql-ruby.org graphql-ruby.org
-
Authorization is the process of verifying that the current user has permission to do something (or see something), for example, checking admin? status or looking up permission groups from the database.
-
Authentication is the process of determining what user is making the current request, for example, accepting a username and password, or finding a User in the database from session[:current_user_id].
-
Instead, your controller should get the current user based on the HTTP request (eg, an HTTP header or a cookie) and provide that information to the GraphQL query.
-
To illustrate the problem:
-
However, this request-by-request mindset doesn’t map well to GraphQL because there’s only one controller and the requests that come to it may be very different.
-
-
github.com github.com
-
I was inspired by udzura's mock.
-
-
web.dev web.dev
-
-
Unfortunately, many existing mechanisms to gauge and propagate trustworthiness—to work out if an interaction with a site is from a real human, for example—take advantage of techniques that can also be used for fingerprinting.
-
Trust Tokens is a new API to help combat fraud and distinguish bots from real humans
-
-
developer.chrome.com developer.chrome.com
-
Trust Token is a new API to help combat fraud and distinguish bots from real humans
-
-
sveltematerialui.com sveltematerialui.com
-
Use this to build a ClassAdder component. ClassAdder components are useful for reducing the size of your bundle. If you have tons of simple components that just need to add classes/props or set a context, using ClassAdder components means there's only one "big" Svelte component in your bundle for all of these many tiny components.
-
This is useful when you need to add classes to a component, since Svelte's "class:" directives don't work on components.
-
-
sveltematerialui.com sveltematerialui.com
-
Masonry
Tags
Annotators
URL
-
-
github.com github.com
-
Note that separator is indeed a valid role for li elements.
-
-
material-ui.com material-ui.com
-
-
Persistent navigation drawers can toggle open or closed. The drawer sits on the same surface elevation as the content. It is closed by default and opens by selecting the menu icon, and stays open until closed by the user. The state of the drawer is remembered from action to action and session to session. When the drawer is outside of the page grid and opens, the drawer forces other content to change size and adapt to the smaller viewport.
-
Temporary drawerTemporary navigation drawers can toggle open or closed. Closed by default, the drawer opens temporarily above all other content until a section is selected.
-
Tags
- app design: navigation
- UI: drawer: temporary drawer
- annotation meta: can't add regular contextual annotations on this document
- Hypothesis meta: annotations created here are linked to the wrong URL (and may become orphans)
- UI: drawer: persistent drawer
- UI: navigation
- UI: breadcrumbs
Annotators
URL
-
-
stackoverflow.com stackoverflow.com
-
Can you provide details of what you mean by "not working as expected"?
-
-
careerfoundry.com careerfoundry.com
-
-
As you read along, you’ll begin to notice UI designer is just another word for a foodie—we love to name our UI elements after food.
-
These little trails of links help users figure out where they are within a website. Often located at the top of a site, breadcrumbs let users see their current location and the proceeding pages. Users are also able to click on them to move between steps.
-
-
www.fuckdropdowns.com www.fuckdropdowns.com
Tags
Annotators
URL
-
-
www.nointerface.com www.nointerface.com
Tags
Annotators
URL
-
-
about.gitlab.com about.gitlab.com
-
document.querySelector('hypothesis-adder') is present but has size of 0x0
-
We try to minimize breaking changes, but some changes are needed to improve workflows, performance, scalability, and more.
-
-
defragged.org defragged.org
-
askubuntu.com askubuntu.com
-
To avoid the problems with different versions of echo you may want to use printf instead. In contrast to echo printf always interprets \ sequences but doesn't automatically add a linefeed at the end so you have to append \n at the end if you want one.
-
-
-
medium.com medium.com
-
Please consider reading this article at the original website.
-
-
store.steampowered.com store.steampowered.com
-
First off: The fact that the developer read the review, saw that a puzzle from elsewhere had made it into the game, fact-checked this, responded, and made an update within 48 hours is exactly the kind of thing I want to support.
.
-
-
stackoverflow.com stackoverflow.com
-
You need to run gem pristin --only-executables Because whenever a ruby is updated or perhaps moved/named, due to RubyGems is generating explicit #!/path/to/ruby for all gem executables, will need to regenerate the gem bin stubs with the new path to the ruby executable.
-
Unfortunately, even though this bug/request was opened in 2016, this feature is still not implemented in ruby-install.
-
Based on the responses in a feature request, the best way to remove older ruby versions is to go back to the src directory and run make uninstall or rake uninstall. By default, ruby-install uses $HOME/src/ruby-$version for unpacked sources of ruby versions during installation.
-
-
github.com github.com
-
AnyCable uses the same protocol as ActionCable, so you can use its JavaScript client without any monkey-patching.
-
AnyCable allows you to use any WebSocket server (written in any language) as a replacement for your Ruby server (such as Faye, Action Cable, etc).
-
-
github.com github.com
-
Whether you agree or not, to me there's nothing in this world that is entirely apolitical - when there are people there is politics. You don't have to agree with my views, nor do I expect you to. Diversity and disagreement is what drives mankind forward.
-
In the end this plugin is a piece of software that I wrote and I'm just doing what I think is reasonable to make our community more inclusive.
- doing what one believes is best for community
-
As aforementioned, the usage of master as a branch most likely originated from the first meaning
The meaning:
An original recording, film, or document from which copies can be made.
makes more sense to me. Why would they have meant the other meaning?
-
I completely understand that master have two meanings: A man who has people working for him, especially servants or slaves; and An original recording, film, or document from which copies can be made.
-
-
so by adopting git installations with latest source code you're effectively agreeing to go bleeding-edge. I would assume that means you're ready for any breaking changes and broken installations, which is what happened here.
-
There are many projects that does not use the master branch as default. For example, Next.js uses the canary branch, the npm CLI and many more other projects uses stuff like prod, production, dev, develop, release, beta, head.
-
I'm not sure if there's any cost in terms of contributing either, especially when by design git can have any branch as default, and will not hinder your experience when you use something other than master.
git is neutral/unbiased/agnostic about default branch name by design
And that is a good thing
-
It just happens that most projects chose to be "lazy" (stick to default), opted to use master
-
to be honest I think it is more about sentiment than actual engineering practices now.
-
Forcing people out of the habit to assume this branch would be called master, is a valuable lesson.
-
The primary branch in git can have any name by design.
-
Well, there are a lot of reasons, with the main reason being that I am empathetic to what is happening out there and I agree with many other people that we should re-examine our choice of words to make the industry more inclusive.
-
Personally I think it is a very bad idea to leverage political views, even if I may share them, through software.
-
I think it's just a bad English/mis-translation problem. I'm guessing @pmmmwh assumed 'master' meant like 主 in 奴隸主 (slave owner/master). Actually a better translation would be 師 like 功夫大師 (Kung Fu master). The specimen copies are made from.
-
The specimen copies are made from.
-
On existing projects, consider the global effort to change from origin/master to origin/main. The cost of being different than git convention and every book, tutorial, and blog post. Is the cost of change and being different worth it?
-
In the context of git, the word "master" is not used in the same way as "master/slave". I've never known about branches referred to as "slaves" or anything similar.
-
I'm glad I never got a master's degree in college!
-
My 3 projects were using your lib and got broken thanks to the renaming.
-
In the context of git, the word "master" is not used in the same way as "master/slave". I've never known about branches referred to as "slaves" or anything similar. On existing projects, consider the global effort to change from origin/master to origin/main. The cost of being different than git convention and every book, tutorial, and blog post. Is the cost of change and being different worth it? PS. My 3 projects were using your lib and got broken thanks to the renaming. PS. PS. I'm glad I never got a master's degree in college!
Tags
- questioning/challenging long-held traditions/beliefs/habits
- confusing wording
- you don't have to agree with my views
- intentional/well-considered decisions
- neutral/unbiased/agnostic
- good question
- git
- inoffensive/inclusive/politically correct wording
- ambiguous
- by design
- high-cost changes
- annotation meta: may need new tag
- words with multiple different meanings: master
- no arbitrary limitation
- is using bleeding-edge tech risky?
- good point
- most people choose the lazy/default option
- I disagree
- this is a good thing
- unintentionally breaking something
- nothing is apolitical where people are involved
- alternative to mainstream way
- sentiment vs. good/rational reasons
- word senses
- doing what one believes is best
- git: default branch
- sharing/spreading political views through software
- forcing people out of a habit
- diversity
- despite:
- lost in translation
- doing something other than the most common/popular option
- is it worth it?
- words with multiple different meanings (ambiguity)
- poor/confusing wording
- re-examining/challenging long-established traditions
- using cutting-edge/pre-release tech
- I like this
- wording
- separation of personal/political views from professional activity
- git: changing from master branch to main
- unintended consequence
- the cost of changing something
- funny
- valuable lesson
- explaining why
- being inclusive
- do pros outweigh/cover cons?
- I agree
Annotators
URL
-
-
www.theserverside.com www.theserverside.com
-
-
However, the term master is out of favor in the computing world and beyond.
-
"While it takes time to make these changes now, it's a one-time engineering cost that will have lasting impacts, both internally and externally," Sorenson said in an email. "We're in this for the long game, and we know inclusive language is just as much about how we code and what we build as it is about person-to-person interactions."
-
"I really appreciate the name change [because] it raises awareness," said Javier Cánovas, assistant professor in the SOM Research Lab, at the Internet Interdisciplinary Institute at the Open University of Catalonia in Barcelona. "There are things that we accept as implicit, and we then realize that we can change them because they don't match our society."
-
the benefits of GitHub renaming the master branch to main far outweigh any temporary stumbling blocks. He said the change is part of a broader internal initiative to add inclusive language to the company's systems. His team is also replacing whitelist and blacklist with allowlist and blocklist.
-
"Both Conservancy and the Git project are aware that the initial branch name, 'master,' is offensive to some people and we empathize with those hurt by the use of that term," said the Software Freedom Conservancy.
-
Let's examine why GitHub renamed the master branch to main branch and what effect it will have on developers.
Tags
- raising awareness
- potentially offensive/non-inclusive wording/terms
- inclusive language
- falling out of favor
- one-time cost
- good explanation
- git: changing from master branch to main
- long term / long game
- things we accept as implicit
- inoffensive/inclusive/politically correct wording
- explaining why
- wording designed to be more palatable/pleasing/inoffensive
Annotators
URL
-
-
github.com github.com
-
The emphasis was made on a raw CDP protocol because Chrome allows you to do so many things that are barely supported by WebDriver because it should have consistent design with other browsers.
compatibility: need for compatibility is limiting:
- innovation
- use of newer features
-
-
Runs headless by default, but you can configure it to run in a headful mode.
first sighting of term: headful
-
There's no official Chrome or Chromium package for Linux don't install it this way because it's either outdated or unofficial, both are bad. Download it from official source.
-
Ferrum connects to the browser by CDP protocol and there's no Selenium/WebDriver/ChromeDriver dependency.
Tags
- compatibility: need for compatibility is limiting
- testing: non-Selenium
- compatibility: need for compatibility is limiting: prevents use of newer features
- browser: headful vs. headless
- software distribution
- unofficial
- testing: CDP-based
- not:
- distributing apps
- first sighting
- CDP (Chrome DevTools Protocol)
- browser: headless
- outdated
- Ferrum (Ruby)
- Selenium/WebDriver
- using cutting-edge/pre-release tech
- good advice
- browser: headful
- reasonable defaults
Annotators
URL
-
-
github.com github.com
-
driven_by :selenium_chrome_headless
first sighting:
driven_by
-
Rails.application.routes.default_url_options[:host] = "localhost:#{Capybara.current_session.server.port}"
-
-
thoughtbot.com thoughtbot.com
-
-
UDP
-
Broadcast messages a ephemeral from the WS server point of view.
-
The main (IMO) feature of MQTT – quality of service – doesn't make sense in our case: if a WebSocket server is down and doesn't receive broadcast messages (through HTTP/Redis/queue), it's likely not to handle client connections too.
-
According to official Actioncable guide, Actioncable creates multiple redis pubsub channels.
-
Yes, AnyCable uses only a single Redis pub/sub channel. Unlike Action Cable, anycable-go manages the actual subscriptions by itself (see hub.go), we only need a single channel to get broadcasts from web apps to a WS server, which performs the actual retransmission. Check out https://docs.anycable.io/#/v1/misc/how_to_anycable_server
-
Right now, we are building a concept proofing prototype using Anycable.
-
We should think about the number of simultaneous connections (peak and average) and the message rate/payload size. I think, the threshold to start thinking about AnyCable (instead of just Action Cable) is somewhere between 500 and 1000 connections on average or 5k-10k during peak hours.
number of simultaneous connections (peak and average)
the message rate/payload size.
-
We use a single stream/queue/channel to deliver messages from RPC to WS. RPC server acts as publisher: it pushes a JSON-encoded command. Pubsub connection is initialized lazily in this case (during the first #broadcast call). WS server (anycable-go) acts as subscriber: subscription is initialized on server start, messages are received, deserialized and passed to the app.
-
they handled this with 4 1x dynos on Heroku (before switching to AnyCable they had 20 2x dynos for ActionCable).
-
HTTP REST seems like an "out of external dependency" way to go.
-
Personally, I like having Redis as a dependency as most of my current applications use two Redis instances; persistent store and volatile.
-
The idea is to avoid additional dependency if it's possible.
Tags
- comparison
- primary feature
- system architecture description/overview
- REST API
- pub/sub
- devops/server architecture
- minimal dependencies
- Redis
- wasteful/inefficient use of resources
- features
- AnyCable
- devops/server architecture: factors
- annotation meta: may need new tag
- ephemeral
- efficiency (computing)
- non-guaranteed delivery
- determining if something is an appropriate application / best tool for the job
- feature: reliable/guaranteed delivery
- threshold to start considering/thinking about this option
- RPC
- I like this
- good idea
- defining feature
- differences
- ActionCable
- UDP
- dependencies: avoid additional dependency if possible
- proof of concept
- dependencies: already using it
- threshold to start considering/thinking about this factor
Annotators
URL
-
-
twitter.com twitter.com
-
So ActionCable needs Redis! Is this the first time Rails is aligning with a vendor product? Why not abstract it like AR/AJ?
-
-
evilmartians.com evilmartians.com
-
prepend(Module.new do
-
A lot of projects leveraging CDP appeared since then, including the most well-known one—Puppeteer, a browser automation library for Node.js. What about the Ruby world? Ferrum, a CDP library for Ruby, although being a pretty young one, provides a comparable to Puppeteer experience. And, what’s more important for us, it ships with a companion project called Cuprite—a pure Ruby Capybara driver using CDP.
-
That’s not the only way of writing end-to-end tests in Rails. For example, you can use Cypress JS framework and IDE. The only reason stopping me from trying this approach is the lack of multiple sessions support, which is required for testing real-time applications (i.e., those with AnyCable 😉).
-
Thus, by adding system tests, we increase the maintenance costs for development and CI environments and introduce potential points of failures or instability: due to the complex setup, flakiness is the most common problem with end-to-end testing. And most of this flakiness comes from communication with a browser.
-
For example, Database Cleaner for a long time was a must-have add-on: we couldn’t use transactions to automatically rollback the database state, because each thread used its own connection; we had to use TRUNCATE ... or DELETE FROM ... for each table instead, which is much slower. We solved this problem by using a shared connection in all threads (via the TestProf extension). Rails 5.1 was released with a similar functionality out-of-the-box.
-
In practice, we usually also need another tool to provide an API to control the browser (e.g., ChromeDriver).
-
There were attempts to simplify this setup by building specific browsers (such as capybara-webkit and PhantomJS) providing such APIs out-of-box, but none of them survived the compatibility race with real browsers.
-
“System tests” is a common naming for automated end-to-end tests in the Rails world. Before Rails adopted this name, we used such variations as feature tests, browser tests
-
even acceptance tests (though the latter are ideologically different)
-
Disclaimer: This article is being regularly updated with the best recommendations up to date, take a look at a Changelog section.
Tags
- disadvantages/drawbacks/cons
- intermittent test failures (flaky tests)
- failed attempt
- naming convention
- Cypress
- browser-based automated testing
- testing: end-to-end
- Ruby: prepend
- Chromedriver
- testing: CDP-based
- testing: database: wrapping tests in transaction
- distinction
- no longer needed
- limitations
- Ferrum (Ruby)
- misnomer
- testing: acceptance tests
- updating a published document: disclosing that it has been updated
- Cuprite (Ruby)
- advantages/merits/pros
- Capybara
- race (general)
- changelog
- unfortunate limitations
- testing: stack: choosing
- naming
- testing: system-level
- competition/race
- Ruby: prepend Module.new
- compatibility
Annotators
URL
-
-
github.com github.com
-
-
Cuprite is a pure Ruby driver (read as no Selenium/WebDriver/ChromeDriver dependency) for Capybara.
-
The design of the driver is as close to Poltergeist as possible though it's not a goal.
-
-
duckduckgo.com duckduckgo.com
Tags
Annotators
URL
-
-
chromedevtools.github.io chromedevtools.github.io
-
duckduckgo.com duckduckgo.com
-
-
github.com github.com
-
We instead recommend using the Selenium or Apparition drivers.
-
Development has been suspended on this project because QtWebKit was deprecated in favor of QtWebEngine, which is not a suitable replacement for our purposes.
-
-
stackoverflow.com stackoverflow.com
-
stackoverflow.com stackoverflow.com
-
FYI, my use case is having clickable links in the mail generated by the integration tests.
-
Setting Capybara.server_port worked when the selenium integration test ran independent of other integration tests, but failed to change the port when run with other tests, at least in my env. Asking for the port number capybara wanted to use, seemed to work better with running multiple tests. Maybe it would have worked if I changed the port for all tests, instead of letting some choose on their own.
-
-
stackoverflow.com stackoverflow.com
-
config.default_max_wait_time = ENV.has_key?("CI") ? 60 : 10
-
-
stackoverflow.com stackoverflow.com
-
Capybara.default_host only affects tests using the rack_test driver (and only if Capybara.app_host isn't set). It shouldn't have the trailing '/' on it, and it already defaults to 'http://www.example.com' so your setting of it should be unnecessary. If what you're trying to do is make all your tests (JS and non-JS) go to 'http://www.example.com' by default then you should be able to do either Capybara.server_host = 'www.example.com' or Capybara.app_host = 'http://www.example.com' Capybara.always_include_port = true
-
-
www.mutuallyhuman.com www.mutuallyhuman.com
-
This is why for a recent Angular+Rails project we chose to use a testing stack from the backend technology’s ecosystem for e2e testing.
-
Rather than write new tooling we decided to take advantage of tooling we had in place for our unit tests. Our unit tests already used FactoryBot, a test data generation library, for building up test datasets for a variety of test scenarios. Plus, we had already built up a nice suite of helpers that we coud re-use. By using tools and libraries already a part of the backend technology’s ecosystem we were able to spend less time building additional tooling. We had less code to maintain because of this and more time to work on solving our customer’s pain points.
-
We were not strictly blackbox testing our application. We wanted to simulate a user walking thru specific scenarios in the app which required that we have corresponding data in the database. This helps ensure integration between the frontend and backend was wired up successfully and would give us a foundation for testing critical user flows.
-
The problem domain and the data involved in this project was complicated enough. We decided that not having to worry about unknowns with the frontend end-to-end testing stack helped mitigate risk. This isn’t to say you should always going with the tool you know, but in this instance we felt it was the right choice.
-
This particular project team came in with a lot of experience using testing tools like RSpec and Capybara. This included integrating with additional tools like Selenium WebDriver, Chrome and Chromedriver, data generation libraries like FactoryBot, and task runners like Rake. We had less experience doing end-to-end testing with Protractor even though it too uses Selenium WebDriver (a tool we’re very comfortable with).
-
There are times to stretch individually and as a team, but there are also times to take advantage of what you already know.
-
When it came to testing the whole product, end-to-end, owning both sides gave us not only more options to consider, but also more tools to choose from.
-
This meant that we owned both sides of the product implementation. For unit testing on the frontend, we stayed with Angular’s suggestion of Jasmine. For unit testing on the backend, we went with rspec-rails. These worked well since unit tests don’t need to cross technology boundaries.
-
We used testing tools that were in the same ecosystem as our backend technology stack for primrily three reasons: We owned both ends of the stack Team experience Interacting with the database
-
We chose to define the frontend in one technology stack (Angular+TypeScript/JavaScript) and the backend in another (Ruby+Ruby on Rails), but both came together to fulfill a singular product vision.
Tags
- rationale
- testing: clear-box testing
- end-to-end testing
- how to choose software stack
- software stack: choosing
- official preferred convention / way to do something
- testing: end-to-end
- testing: stack
- officially recommended
- distributed (client/server) system
- people stick to what they know
- avoid extra/needless work
- answer the "why?"
- testing: black-box testing
- don't repeat yourself
- me too
- testing: unit tests
- determining if something is an appropriate application / best tool for the job
- software stack: choosing: factors: code reuse
- using disparate technologies in a single project
- frontend vs. backend: owning both ends
- wise choice
- good advice
- how to choose a dependency/library/framework
- reuse/leverage existing _ when possible
- testing: stack: choosing
- software stack: choosing: factors: familiarity/experience
- explaining why
- key point
- don't reinvent the wheel
Annotators
URL
-
-
www.audienceplay.com www.audienceplay.com
-
CMP or consent management platform is a platform or a tool to take consent from the visitor to use his/her digital identity for marketing efforts.
-
“The data does not exist independently in the world, nor is it generated spontaneously. Data is constructed by people, from people,” (source 1).
-
-
-
store.steampowered.com store.steampowered.com
-
Cool concept but badly executed.
.
-
-
github.com github.com
-
Once a variable is specified with the use method, access it with EnvSetting.my_var Or you can still use the Hash syntax if you prefer it: EnvSetting["MY_VAR"]
-
Configuration style is exactly the same for env_bang and env_setting, only that there's no "ENV!" method... just the normal class: EnvSetting that is called and configured.
-
Inspired by ENV! and David Copeland's article on UNIX Environment, env_setting is a slight rewrite of env_bang to provide OOP style access to your ENV.
-
Fail loudly and helpfully if any environment variables are missing.
-
-
github.com github.com
-
add_class Set do |value, options| Set.new self.Array(value, options || {}) end use :NUMBER_SET, class: Set, of: Integer
-
-
use :ENABLE_SOUNDTRACK, class: :boolean
-
ENV! can convert your environment variables for you, keeping that tedium out of your application code. To specify a type, use the :class option:
-
-
gitlab.com gitlab.com
-
naildrivin5.com naildrivin5.com
-
It also makes it hard to centralize type coercions and default values.
-
-
It’s easy to create bugs because the environment is a somewhat degenerate settings database.
-
It also makes your code harder to follower because you are using SCREAMING_SNAKE_CASE instead of nice, readable methods.
-
Most programming languages vend environment variables as strings. This leads to errors like so:
Tags
- less than ideal / not optimal
- letter case: all capitals: hard/unpleasant to read
- coerce string values to boolean
- messy
- illustrating problem
- programming: centralized location in code
- poor solution
- Ruby: ENV
- environment variables
- Ruby: ENV interfaces
- Ruby: ENV: don't use ENV directly
- answer the "why?"
- database
Annotators
URL
-
-
github.com github.com
-
github.com github.com
Tags
Annotators
URL
-