diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81c1610..cb9826f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,6 +34,7 @@ jobs: - uses: browser-actions/setup-chrome@v1 with: chrome-version: stable + install-chromedriver: true if: matrix.os == 'windows-latest' - uses: crystal-lang/install-crystal@v1 with: @@ -58,7 +59,8 @@ jobs: - uses: actions/checkout@v4 - uses: browser-actions/setup-chrome@v1 with: - chrome-version: beta + chrome-version: stable + install-chromedriver: true if: matrix.os == 'windows-latest' - uses: crystal-lang/install-crystal@v1 with: diff --git a/Dockerfile b/Dockerfile index d6b78c5..9e0dbb0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM crystallang/crystal:1.10.0 +FROM crystallang/crystal:1.14.1 WORKDIR /data EXPOSE 3002 @@ -7,7 +7,7 @@ RUN apt-get update \ libnss3 \ libgconf-2-4 \ chromium-browser \ - firefox-geckodriver \ + firefox \ && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* COPY . /data diff --git a/docker-compose.yml b/docker-compose.yml index dcc921e..62faa36 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3" - services: app: build: diff --git a/script/setup b/script/setup index bec0049..1e3dfc1 100755 --- a/script/setup +++ b/script/setup @@ -4,14 +4,11 @@ set -e set -o pipefail -if command -v docker-compose > /dev/null; then - docker-compose build - docker-compose run app shards install -elif command -v docker compose > /dev/null; then +if command -v docker compose > /dev/null; then docker compose build docker compose run app shards install else - printf 'Docker and/or docker-compose are not installed.\n' + printf 'Command docker compose does not exist. Install Docker.\n' printf 'See https://docs.docker.com/compose/install/ for install instructions.\n' exit 1 fi diff --git a/script/test b/script/test index f6ddfce..5150c77 100755 --- a/script/test +++ b/script/test @@ -4,9 +4,7 @@ set -e set -o pipefail -if command -v docker-compose > /dev/null; then - COMPOSE="docker-compose run app" -elif command -v docker compose > /dev/null; then +if command -v docker compose > /dev/null; then COMPOSE="docker compose run app" fi diff --git a/shard.yml b/shard.yml index 31e24ed..f1f7d54 100644 --- a/shard.yml +++ b/shard.yml @@ -20,7 +20,7 @@ dependencies: version: ">= 0.4.7, < 0.5" webless: github: crystal-loot/webless - version: ">= 0.1.0, < 0.2" + version: ">= 0.2.0, < 0.3" html5: github: naqvis/crystal-html5 version: ">= 0.5.0, < 0.6" diff --git a/spec/lucky_flow_spec.cr b/spec/lucky_flow_spec.cr index 9d6866e..c50e36e 100644 --- a/spec/lucky_flow_spec.cr +++ b/spec/lucky_flow_spec.cr @@ -494,12 +494,12 @@ private class FakeProcess class_property command : String? class_property shell : Bool? - def initialize(command, shell) + def initialize(command : String?, shell : Bool?) @@command = command @@shell = shell end - def self.find_executable(string) + def self.find_executable(string : String) "/fake_path_to_executable" end end diff --git a/spec/support/test_handler.cr b/spec/support/test_handler.cr index 9359cf5..c2a4894 100644 --- a/spec/support/test_handler.cr +++ b/spec/support/test_handler.cr @@ -6,9 +6,10 @@ class TestHandler if context.request.resource == "/favicon.ico" context.response.print "" else - handler = routes[context.request.resource] - context.response.content_type = "text/html" - context.response.print handler.call(context) + if handler = routes[context.request.resource]? + context.response.content_type = "text/html" + context.response.print handler.call(context) + end end end diff --git a/src/ext/avram.cr b/src/ext/avram.cr index 757fcc1..d7e8160 100644 --- a/src/ext/avram.cr +++ b/src/ext/avram.cr @@ -12,7 +12,7 @@ module AvramLuckyFlowHelpers # ``` def fill_form( form : Avram::SaveOperation.class | Avram::Operation.class, - **fields_and_values + **fields_and_values, ) fields_and_values.each do |name, value| element = field("#{form.param_key}:#{name}") diff --git a/src/lucky_flow.cr b/src/lucky_flow.cr index c3cc8bd..39a3cb4 100644 --- a/src/lucky_flow.cr +++ b/src/lucky_flow.cr @@ -49,7 +49,7 @@ class LuckyFlow driver.visit("#{settings.base_uri}#{path}") end - def open_screenshot(process = Process, time = Time.utc, fullsize = false) : Void + def open_screenshot(process = Process, time = Time.utc, fullsize = false) : Nil filename = generate_screenshot_filename(time) take_screenshot(filename, fullsize) process.new(command: "#{open_command(process)} #{filename}", shell: true) diff --git a/src/lucky_flow/error_message_when_not_found.cr b/src/lucky_flow/error_message_when_not_found.cr index 37e1257..288660e 100644 --- a/src/lucky_flow/error_message_when_not_found.cr +++ b/src/lucky_flow/error_message_when_not_found.cr @@ -11,7 +11,7 @@ class LuckyFlow::ErrorMessageWhenNotFound @driver : LuckyFlow::Driver, @selector : String, @inner_text : String?, - @negate : Bool = false + @negate : Bool = false, ) end diff --git a/src/lucky_flow/find_element.cr b/src/lucky_flow/find_element.cr index e847a5e..94347c9 100644 --- a/src/lucky_flow/find_element.cr +++ b/src/lucky_flow/find_element.cr @@ -19,7 +19,7 @@ class LuckyFlow::FindElement return matching_elements.first if matching_elements.first? break unless has_retries_left? - sleep retry_delay_in_ms + sleep retry_delay_in_ms.milliseconds end raise_element_not_found_error @@ -33,8 +33,8 @@ class LuckyFlow::FindElement (settings.stop_retrying_after / settings.retry_delay).to_i end - private def retry_delay_in_ms : Float - settings.retry_delay.total_milliseconds / 1_000 + private def retry_delay_in_ms : Float64 + settings.retry_delay.total_milliseconds end private def settings diff --git a/src/lucky_flow/selenium/driver.cr b/src/lucky_flow/selenium/driver.cr index 720395b..03cce99 100644 --- a/src/lucky_flow/selenium/driver.cr +++ b/src/lucky_flow/selenium/driver.cr @@ -9,7 +9,7 @@ abstract class LuckyFlow::Selenium::Driver < LuckyFlow::Driver end def screenshot(path : String) - FileUtils.mkdir_p(File.dirname(path)) + Dir.mkdir_p(File.dirname(path)) session.screenshot(path) end @@ -89,7 +89,7 @@ abstract class LuckyFlow::Selenium::Driver < LuckyFlow::Driver private def retry_start_session(e) if Time.utc <= @retry_limit - sleep(0.1) + sleep(100.milliseconds) start_session else raise e @@ -98,7 +98,7 @@ abstract class LuckyFlow::Selenium::Driver < LuckyFlow::Driver private def find_elements( strategy : Symbol, - query : String + query : String, ) : Array(LuckyFlow::Element) session.find_elements(strategy, query).map do |element| LuckyFlow::Selenium::Element