Can't compile Plots - installation

I installed a new version of Julia, version 1.7.
And while trying to install Plots, I had the following error. I did ] add Plots and ] build Plots without any errors.
julia> using Plots
[ Info: Precompiling Plots [91a5bcdd-55d7-5caf-9e0b-520d859cae80]
ERROR: LoadError: InitError: could not load library "/home/mylaboratory/myname/.julia/artifacts/4487a7356408c3a92924e56f9d3891724855282c/lib/libXau.so"
/home/mylaboratory/myname/.julia/artifacts/4487a7356408c3a92924e56f9d3891724855282c/lib/libXau.so: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type
Stacktrace:
[1] dlopen(s::String, flags::UInt32; throw_error::Bool)
# Base.Libc.Libdl ./libdl.jl:117
[2] dlopen(s::String, flags::UInt32)
# Base.Libc.Libdl ./libdl.jl:117
[3] macro expansion
# ~/.julia/packages/JLLWrappers/QpMQW/src/products/library_generators.jl:54 [inlined]
[4] __init__()
# Xorg_libXau_jll ~/.julia/packages/Xorg_libXau_jll/z2hT9/src/wrappers/x86_64-linux-gnu.jl:8
[5] _include_from_serialized(path::String, depmods::Vector{Any})
# Base ./loading.jl:768
[6] _require_search_from_serialized(pkg::Base.PkgId, sourcepath::String)
# Base ./loading.jl:854
[7] _require(pkg::Base.PkgId)
# Base ./loading.jl:1097
[8] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[9] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[10] include(mod::Module, _path::String)
# Base ./Base.jl:418
[11] top-level scope
# ~/.julia/packages/JLLWrappers/QpMQW/src/toplevel_generators.jl:188
[12] include
# ./Base.jl:418 [inlined]
[13] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source
::String)
# Base ./loading.jl:1318
[14] top-level scope
# none:1
[15] eval
# ./boot.jl:373 [inlined]
[16] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[17] top-level scope
# none:1
during initialization of module Xorg_libXau_jll
in expression starting at /home/mylaboratory/myname/.julia/packages/Xorg_libxcb_jll/nMYKH/src/wrappers/x86_64-linux-gnu.jl:5
in expression starting at /home/mylaboratory/myname/.julia/packages/Xorg_libxcb_jll/nMYKH/src/Xorg_libxcb_jll.jl:2
ERROR: LoadError: Failed to precompile Xorg_libxcb_jll [c7cfdc94-dc32-55de-ac96-5a1b8d977c5b] to /home/mylaboratory/myname/.julia/compiled/v1.7/Xorg_libxcb_jll/jl_IJgtUS.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[7] include(mod::Module, _path::String)
# Base ./Base.jl:418
[8] top-level scope
# ~/.julia/packages/JLLWrappers/QpMQW/src/toplevel_generators.jl:188
[9] include
# ./Base.jl:418 [inlined]
[10] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source::String)
# Base ./loading.jl:1318
[11] top-level scope
# none:1
[12] eval
# ./boot.jl:373 [inlined]
[13] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[14] top-level scope
# none:1
in expression starting at /home/mylaboratory/myname/.julia/packages/Xorg_libX11_jll/ICRWq/src/wrappers/x86_64-linux-gnu.jl:4
in expression starting at /home/mylaboratory/myname/.julia/packages/Xorg_libX11_jll/ICRWq/src/Xorg_libX11_jll.jl:2
ERROR: LoadError: Failed to precompile Xorg_libX11_jll [4f6342f7-b3d2-589e-9d20-edeb45f2b2bc] to /home/mylaboratory/myname/.julia/compiled/v1.7/Xorg_libX11_jll/jl_ntTOt0.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[7] include(mod::Module, _path::String)
# Base ./Base.jl:418
[8] top-level scope
[9] include
# ./Base.jl:418 [inlined]
[10] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source
::String)
# Base ./loading.jl:1318
[11] top-level scope
# none:1
[12] eval
# ./boot.jl:373 [inlined]
[13] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[14] top-level scope
# none:1
in expression starting at /home/mylaboratory/myname/.julia/packages/Cairo_jll/HW4xi/src/wrappers/x86_64-linux-gnu.jl:10
in expression starting at /home/mylaboratory/myname/.julia/packages/Cairo_jll/HW4xi/src/Cairo_jll.jl:2
ERROR: LoadError: Failed to precompile Cairo_jll [83423d85-b0ee-5818-9007-b63ccbeb887a] to /home/mylaboratory/myname/.julia/compiled/v1.7/Cairo_jll/jl_YPjkuT.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[7] include(mod::Module, _path::String)
# Base ./Base.jl:418
[8] top-level scope
# ~/.julia/packages/JLLWrappers/QpMQW/src/toplevel_generators.jl:188
[9] include
# ./Base.jl:418 [inlined]
[10] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source::String)
# Base ./loading.jl:1318
[11] top-level scope
# none:1
[12] eval
# ./boot.jl:373 [inlined]
[13] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[14] top-level scope
# none:1
in expression starting at /home/mylaboratory/myname/.julia/packages/HarfBuzz_jll/zavaV/src/wrappers/x86_64-linux-gnu.jl:4
in expression starting at /home/mylaboratory/myname/.julia/packages/HarfBuzz_jll/zavaV/src/HarfBuzz_jll.jl:2
ERROR: LoadError: Failed to precompile HarfBuzz_jll [2e76f6c2-a576-52d4-95c1-20adfe4de566] to /home/mylaboratory/myname/.julia/compiled/v1.7/HarfBuzz_jll/jl_qkmYhc.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[7] include(mod::Module, _path::String)
# Base ./Base.jl:418
[8] top-level scope
# ~/.julia/packages/JLLWrappers/QpMQW/src/toplevel_generators.jl:188
[9] include
# ./Base.jl:418 [inlined]
[10] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source::String)
# Base ./loading.jl:1318
[11] top-level scope
# none:1
[12] eval
# ./boot.jl:373 [inlined]
[13] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[14] top-level scope
# none:1
in expression starting at /home/mylaboratory/myname/.julia/packages/libass_jll/SaaQW/src/wrappers/x86_64-linux-gnu.jl:6
in expression starting at /home/mylaboratory/myname/.julia/packages/libass_jll/SaaQW/src/libass_jll.jl:2
ERROR: LoadError: Failed to precompile libass_jll [0ac62f75-1d6f-5e53-bd7c-93b484bb37c0] to /home/mylaboratory/myname/.julia/compiled/v1.7/libass_jll/jl_Na90wC.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[7] include(mod::Module, _path::String)
# Base ./Base.jl:418
[8] top-level scope
# ~/.julia/packages/JLLWrappers/QpMQW/src/toplevel_generators.jl:188
[9] include
# ./Base.jl:418 [inlined]
[10] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source::String)
# Base ./loading.jl:1318
[11] top-level scope
# none:1
[12] eval
# ./boot.jl:373 [inlined]
[13] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[14] top-level scope
# none:1
in expression starting at /home/mylaboratory/myname/.julia/packages/FFMPEG_jll/ECokx/src/wrappers/x86_64-linux-gnu.jl:4
in expression starting at /home/mylaboratory/myname/.julia/packages/FFMPEG_jll/ECokx/src/FFMPEG_jll.jl:2
ERROR: LoadError: Failed to precompile FFMPEG_jll [b22a6f82-2f65-5046-a5b2-351ab43fb4e5] to /home/mylaboratory/myname/.julia/compiled/v1.7/FFMPEG_jll/jl_WqXB6W.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[7] include
# ./Base.jl:418 [inlined]
[8] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source::String)
# Base ./loading.jl:1318
[9] top-level scope
# none:1
[10] eval
# ./boot.jl:373 [inlined]
[11] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[12] top-level scope
# none:1
in expression starting at /home/mylaboratory/myname/.julia/packages/FFMPEG/OUpap/src/FFMPEG.jl:1
ERROR: LoadError: Failed to precompile FFMPEG_jll [b22a6f82-2f65-5046-a5b2-351ab43fb4e5] to /home/mylaboratory/myname/.julia/compiled/v1.7/FFMPEG_jll/jl_WqXB6W.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[7] include
# ./Base.jl:418 [inlined]
[8] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source::String)
# Base ./loading.jl:1318
[9] top-level scope
# none:1
[10] eval
# ./boot.jl:373 [inlined]
[11] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[12] top-level scope
# none:1
in expression starting at /home/mylaboratory/myname/.julia/packages/FFMPEG/OUpap/src/FFMPEG.jl:1
ERROR: LoadError: Failed to precompile FFMPEG [c87230d0-a227-11e9-1b43-d7ebe4e7570a] to /home/mylaboratory/myname/.julia/compiled/v1.7/FFMPEG/jl_OjH0xW.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
[7] include
# ./Base.jl:418 [inlined]
[8] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt64}}, source::Nothing)
# Base ./loading.jl:1318
[9] top-level scope
# none:1
[10] eval
# ./boot.jl:373 [inlined]
[11] eval(x::Expr)
# Base.MainInclude ./client.jl:453
[12] top-level scope
# none:1
in expression starting at /home/mylaboratory/myname/.julia/packages/Plots/nzdhU/src/Plots.jl:1
ERROR: Failed to precompile Plots [91a5bcdd-55d7-5caf-9e0b-520d859cae80] to /home/mylaboratory/myname/.julia/compiled/v1.7/Plots/jl_mvedww.
Stacktrace:
[1] error(s::String)
# Base ./error.jl:33
[2] compilecache(pkg::Base.PkgId, path::String, internal_stderr::IO, internal_stdout::IO, ignore_loaded_modules::Bool)
# Base ./loading.jl:1466
[3] compilecache(pkg::Base.PkgId, path::String)
# Base ./loading.jl:1410
[4] _require(pkg::Base.PkgId)
# Base ./loading.jl:1120
[5] require(uuidkey::Base.PkgId)
# Base ./loading.jl:1013
[6] require(into::Module, mod::Symbol)
# Base ./loading.jl:997
This is the longest error I ever had in Julia by far and I have no idea what to do from here to fix it. Thank you a lot for your kind help!
Here are my packages versions:
(#v1.7) pkg> status
Status `~/.julia/environments/v1.7/Project.toml`
[159f3aea] Cairo v1.0.5
[861a8166] Combinatorics v1.0.2
[a81c6b42] Compose v0.9.3
[7db386b5] DependencyWalker v0.1.2
[31c24e10] Distributions v0.25.54
[c87230d0] FFMPEG v0.4.1
[186bb1d3] Fontconfig v0.4.0
[59287772] Formatting v0.4.2
[a2cc645c] GraphPlot v0.5.0
[86223c79] Graphs v1.6.0
[06909019] GraphsFlows v0.1.0
[2e9cd046] Gurobi v0.9.14
[4076af6c] JuMP v0.21.10
[d96e819e] Parameters v0.12.3
[f3e62ec7] PkgCleanup v0.1.0 `https://github.com/giordano/PkgCleanup.jl#main`
[91a5bcdd] Plots v1.28.0
[770da0de] UpdateJulia v0.4.0
[ade2ca70] Dates
[8bb1440f] DelimitedFiles
[9a3f8284] Random
EDIT: When doing ] rm Plots ; update ; resolve ; add Plots
I got this:
Precompiling project...
✗ Plots
0 dependencies successfully precompiled in 14 seconds (145 already precompiled, 29 skipped during auto due to previous errors)
1 dependency errored. To see a full report either run `import Pkg; Pkg.precompile()` or load the package
And build Plots gives the same error. Downgrading GR to v0.61.2 did not solve the issue unfortefunately

Same issue here:
julia> versioninfo()
Julia Version 1.7.2
Commit bf53498635 (2022-02-06 15:21 UTC)
After an ] update I had the Plots' compilation error. In the Manifest.toml I have
[[Plots]]
deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"]
git-tree-sha1 = "c64338ef7b60f8458a9feaadd378261bd3279c89"
uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
version = "1.28.0"
Fixed the issue downgrading the GR package from 0.64.2 to 0.64.1
[[GR]]
deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"]
git-tree-sha1 = "df5f5b0450c489fe6ed59a6c0a9804159c22684d"
uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71"
version = "0.64.1"

Related

Ruby - dry-rb - how to update an existing object's attributes?

Using dry-rb structs and types, I'm trying amend an object that has already been created, but can't seem to figure it out.
[3] pry(main)> class User < Dry::Struct
attribute :name, Types::String.optional
attribute :age, Types::Coercible::Integer
end
=> User
[4] pry(main)> user = User.new(name: nil, age: '21')
=> #<User name=nil age=21>
[5] pry(main)> user.name = "ted"
NoMethodError: undefined method `name=' for #<User name=nil age=21>
Did you mean? name
from (pry):10:in `__pry__'
[6] pry(main)> user(name: "Ted")
NoMethodError: undefined method `user' for main:Object
Did you mean? super
from (pry):11:in `__pry__'
[7] pry(main)> user[:name => "Ted"]
Dry::Struct::MissingAttributeError: Missing attribute: {:name=>"Ted"}
from /Users/me/.rvm/gems/ruby-2.6.5/gems/dry-struct-1.3.0/lib/dry/struct.rb:137:in `block in []'
[8] pry(main)> user('name' => 'Ted')
NoMethodError: undefined method `user' for main:Object
Did you mean? super
from (pry):13:in `__pry__'
Is this just not possible, or am I missing something super obvious? Any help is much appreciated

ruby multiline statement returns different value than inline statement

I have introduced a bug into my sourcecode by simply separating join/map/split statements. I can't understand why this behavior happens. Any idea why this happens and how to get func2 to act as func1?
def func1(params)
params.split('&').map { |str| str.split('=').last }.join('-')
end
def func2(params)
params.split('&')
.map { |str| str.split('=').last }
.join('-')
end
func1("a=1&b=2&c=3") # "1-2-3"
func2("a=1&b=2&c=3") # ["a=1", "b=2", "c=3"]
For what it's worth, I can reproduce with Ruby 2.6.3 and Pry 0.12.2:
[1] pry(main)> def func1(params)
[1] pry(main)* params.split('&').map { |str| str.split('=').last }.join('-')
[1] pry(main)* end
=> :func1
[2] pry(main)>
[3] pry(main)> def func2(params)
[3] pry(main)* params.split('&')
[3] pry(main)* .map { |str| str.split('=').last }
sh: 1: Syntax error: word unexpected (expecting ")")
Error: there was a problem executing system command: map { |str| str.split('=').last }
[3] pry(main)* .join('-')
sh: 1: Syntax error: word unexpected (expecting ")")
Error: there was a problem executing system command: join('-')
[3] pry(main)* end
=> :func2
[4] pry(main)>
[5] pry(main)> func1("a=1&b=2&c=3") # "1-2-3"
=> "1-2-3"
[6] pry(main)> func2("a=1&b=2&c=3") # ["a=1", "b=2", "c=3"]
=> ["a=1", "b=2", "c=3"]
[7] pry(main)> Pry::VERSION
=> "0.12.2"
It seems to work fine with standard IRB:
2.6.3 :001 > def func1(params)
2.6.3 :002?> params.split('&').map { |str| str.split('=').last }.join('-')
2.6.3 :003?> end
=> :func1
2.6.3 :004 >
2.6.3 :005 > def func2(params)
2.6.3 :006?> params.split('&')
2.6.3 :007?> .map { |str| str.split('=').last }
2.6.3 :008?> .join('-')
2.6.3 :009?> end
=> :func2
2.6.3 :010 >
2.6.3 :011 > func1("a=1&b=2&c=3") # "1-2-3"
=> "1-2-3"
2.6.3 :012 > func2("a=1&b=2&c=3") # ["a=1", "b=2", "c=3"]
=> "1-2-3"
Changing to
def func2(params)
params.split('&').map do |str|
str.split('=').last
end.join('-')
end
solves the problem in Pry.
This issue ("Need easy way to paste multiline code") might be related.

Simple ruby code demonstrating default arguments is throwing name/method error

Seems pretty straightforward. Trying to write a simple code that has a default argument. This throws an error with a name error and method error. Code should be able to take any argument and print the arg and if not arg given print "meat".
Any help why its throwing errors?
def meal_choice( meal = "meat")
puts "#{meal}"
end
Failures:
1) #meal_choice should default to meat
Failure/Error: expect(meal_choice).to eq("meat")
NameError:
undefined local variable or method `meal_choice' for #<RSpec::ExampleGroups::MealChoice:0x007fb4ec159188>
# ./spec/meal_choice_spec.rb:3:in `block (2 levels) in <top (required)>'
2) #meal_choice should allow you to set a meal
Failure/Error: expect(meal_choice("vegan")).to eq("vegan")
NoMethodError:
undefined method `meal_choice' for #<RSpec::ExampleGroups::MealChoice:0x007fb4ec14b0d8>
# ./spec/meal_choice_spec.rb:7:in `block (2 levels) in <top (required)>'
Finished in 0.00125 seconds (files took 0.12294 seconds to load)
2 examples, 2 failures
Failed examples:
rspec ./spec/meal_choice_spec.rb:2 # #meal_choice should default to meat
rspec ./spec/meal_choice_spec.rb:6 # #meal_choice should allow you to set a meal
It is a working code:
[1] pry(main)> def meal_choice( meal = "meat")
[1] pry(main)* puts "#{meal}"
[1] pry(main)* end
#=> :meal_choice
[2] pry(main)> meal_choice
#=> meat
#=> nil
[3] pry(main)> meal_choice(:sdgsdg)
#=> sdgsdg
#=> nil
You must be having a typo in the method call or wrongly calling a method.
You need to make the method do the work without puts:
def meal_choice (meal = "meat")
meal
end

ActiveRecords select(:id).collect vs. pluck(:id) methods: Why is pure AR "pluck" slower?

I am trying to get all the ids from my Article model. I can do it two ways:
Article.select(:id).collect{|a| a.id}
Article Load (2.6ms) SELECT "articles"."id" FROM "articles"
OR
2.2.1 :006 > Article.pluck(:id)
(4.3ms) SELECT "articles"."id" FROM "articles"
What gives? Why is the AR slower than the Ruby version?
Even when I benchmark the Ruby method, it seems faster:
Benchmark.measure{Article.select(:id).collect{|a| a.id}}
Article Load (1.9ms) SELECT "articles"."id" FROM "articles"
=> #<Benchmark::Tms:0x007feb12060658 #label="", #real=0.026455502957105637, #cstime=0.0, #cutime=0.0, #stime=0.0, #utime=0.020000000000000018, #total=0.020000000000000018>
Your benchmark is inaccurate. First of all, as you can see, both executions on the database side triggers the same query
SELECT "articles"."id" FROM "articles"
Therefore, the database time should be considered irrelevant. Clearly the two queries had different execution time as shown by the console, but this is normal as if you run the same query 100 times the execution time can be different each time as it depends by a variety of variables such as the machine load, the database state, etc.
Since the database execution time can be considered equivalent, it's irrelevant for the benchmark.
Therefore, what you need to compare is the Ruby execution time and allocation. Pluck is supposed to be faster and more lightweight as compared to collect it doesn't allocate ActiveRecord objects, rather it returns only the selected values.
If you really want to benchmark the methods, you should mock the database time (which is clearly variable but irrelevant for this benchmark) and only benchmark allocation and the two different Ruby methods.
Long story short, pluck is generally more efficient.
select is used to fetch records with specific attributes. It returns an ActiveRecord::Relation object.
pluck can be used the same way select is used, however it returns an array of selected attributes.
You can go through this article.
You shouldn't pay attention to the times recorded in the console and do a proper benchmark instead. Here's how much faster select can be when used in a nested query (about 30 times faster!)
[25] pry(main)> ActiveRecord::Base.logger = nil
[25] pry(main)> Benchmark.bmbm do |bm|
[25] pry(main)* bm.report('select') do
[25] pry(main)* 2000.times do
[25] pry(main)* ActiveRecord::Base.uncached do
[25] pry(main)* Agenda.where(organization_id: Organization.limit(2).select(:id))
[25] pry(main)* end
[25] pry(main)* end
[25] pry(main)* end
[25] pry(main)* bm.report('pluck') do
[25] pry(main)* 2000.times do
[25] pry(main)* ActiveRecord::Base.uncached do
[25] pry(main)* Agenda.where(organization_id: Organization.limit(2).pluck(:id))
[25] pry(main)* end
[25] pry(main)* end
[25] pry(main)* end
[25] pry(main)* end
Rehearsal ------------------------------------------
select 0.147064 0.001408 0.148472 ( 0.149976)
pluck 1.494075 0.077501 1.571576 ( 4.175919)
--------------------------------- total: 1.720048sec
user system total real
select 0.140494 0.000301 0.140795 ( 0.140956)
pluck 1.200006 0.070174 1.270180 ( 3.958814)
As has been explained, this is because in the first case the query is merged into the main query as a nested select, while with pluck a first query is executed to get the ids, which are then used to run the main query.
Bear in mind that this kinds of benchmarks always depend on your database, indexes, amount of rows you're dealing with, etc. When in doubt always run a quick benchmark to confirm this kind hypothesis!
For the record, here's a similar benchmark for your kind of "simple" query, which indeed shows pluck is faster, albeit not by a huge margin:
[27] pry(main)> Benchmark.bmbm do |bm|
[27] pry(main)* bm.report('select') do
[27] pry(main)* 2000.times do
[27] pry(main)* ActiveRecord::Base.uncached do
[27] pry(main)* Organization.select(:id).collect(&:id)
[27] pry(main)* end
[27] pry(main)* end
[27] pry(main)* end
[27] pry(main)* bm.report('pluck') do
[27] pry(main)* 2000.times do
[27] pry(main)* ActiveRecord::Base.uncached do
[27] pry(main)* Organization.pluck(:id)
[27] pry(main)* end
[27] pry(main)* end
[27] pry(main)* end
[27] pry(main)* end
Rehearsal ------------------------------------------
select 1.669422 0.080951 1.750373 ( 4.318759)
pluck 1.081312 0.064770 1.146082 ( 3.797270)
--------------------------------- total: 2.896455sec
user system total real
select 1.601772 0.069176 1.670948 ( 4.298829)
pluck 1.094950 0.064165 1.159115 ( 3.811094)

Why is this raising a "not a directory" error?

This is from the Aruba Cucumber api for testing a CLI. I keep getting an error that dotfiles is not a directory. It is a directory but can't figure out why the error is occuring.
From the aruba api:
def current_dir
File.join(*dirs)
end
def dirs
#dirs ||= ['tmp', 'aruba']
end
def cd(dir)
dirs << dir
raise "#{current_dir} is not a directory." unless File.directory?(current_dir)
end
So running Dir.entries(ENV['HOME']) includes the directory dotfiles. I know it's there.
"Applications",
"clone",
"Desktop",
"Documents",
"dotfiles",
etc...
Now using the above methods from the aruba api
[6] pry(main)> Dir.pwd
=> "/Users/Brian"
[7] pry(main)> Dir.home
=> "/Users/Brian"
[8] pry(main)> cd(File.join(ENV['HOME'], 'dotfiles'))
RuntimeError: tmp/aruba/Users/Brian/dotfiles is not a directory. # ?????
from /Users/Brian/test_aruba.rb:11:in `cd'
Why is this not seeing dotfiles is a directory?
Any help would be great. thanks

Resources