Skip to content

Commit

Permalink
Rework List item group
Browse files Browse the repository at this point in the history
  • Loading branch information
pnatashap committed Jan 9, 2024
1 parent b5a185d commit d6ad14b
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
/**
* Assertions for {@link ListItem}
*/
public class ListItemAssert extends UIAssert<ListItemAssert, ListItem> implements ITextAssert<ListItemAssert> {
public class ListItemAssert extends UIAssert<ListItemAssert, ListItem>
implements ITextAssert<ListItemAssert> {

@Override
@JDIAction(value = "Assert that '{name}' is displayed", isAssert = true)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,95 +1,109 @@
package com.epam.jdi.light.vuetify.asserts;

import com.epam.jdi.light.asserts.generic.UIAssert;
import com.epam.jdi.light.common.JDIAction;
import com.epam.jdi.light.vuetify.elements.complex.ListItemGroup;
import com.epam.jdi.light.asserts.generic.ColorAssert;
import com.epam.jdi.light.vuetify.interfaces.asserts.FlatAssert;
import com.epam.jdi.light.vuetify.interfaces.asserts.ThemeAssert;
import org.hamcrest.Matchers;

import static com.epam.jdi.light.asserts.core.SoftAssert.jdiAssert;


public class ListItemGroupsAssert extends UIAssert<ListItemGroupsAssert, ListItemGroup> implements
FlatAssert<ListItemGroupsAssert, ListItemGroup>, ColorAssert<ListItemGroupsAssert, ListItemGroup>,
ThemeAssert<ListItemGroupsAssert, ListItemGroup> {
public class ListItemGroupAssert extends ListItemAssert implements
FlatAssert<ListItemGroupAssert, ListItemGroup> {

@Override
public ListItemGroup element() {
return (ListItemGroup) super.element();
}

public ListItemGroupAssert set(ListItemGroup element) {
super.set(element);
return this;
}

public ListItemGroupAssert and() {
super.and();
return this;
}


@JDIAction(value = "Assert that '{name}' is active", isAssert = true)
public ListItemGroupsAssert active() {
public ListItemGroupAssert active() {
jdiAssert(element().isActive(), Matchers.is(true), "ListItemGroup is not active");
return this;
}

@JDIAction(value = "Assert that '{name}' is not active", isAssert = true)
public ListItemGroupsAssert notActive() {
public ListItemGroupAssert notActive() {
jdiAssert(element().isActive(), Matchers.is(false), "ListItemGroup is active");
return this;
}

@JDIAction(value = "Assert that '{name}' has title", isAssert = true)
public ListItemGroupsAssert title() {
jdiAssert(element().hasTitle(), Matchers.is(true), "ListItemGroup has no title");
public ListItemGroupAssert title() {
jdiAssert(element().header().isExist(), Matchers.is(true), "ListItemGroup has no title");
return this;
}

@JDIAction(value = "Assert that '{name}' has no title", isAssert = true)
public ListItemGroupsAssert noTitle() {
jdiAssert(element().hasTitle(), Matchers.is(false), "ListItemGroup has title");
public ListItemGroupAssert noTitle() {
jdiAssert(element().header().isExist(), Matchers.is(false), "ListItemGroup has title");
return this;
}

@JDIAction(value = "Assert that '{name}' has border", isAssert = true)
public ListItemGroupsAssert border() {
public ListItemGroupAssert border() {
jdiAssert(element().hasBorder(), Matchers.is(true), "ListItemGroup has no border");
return this;
}

@JDIAction(value = "Assert that '{name}' has not border", isAssert = true)
public ListItemGroupsAssert noBorder() {
public ListItemGroupAssert noBorder() {
jdiAssert(element().hasBorder(), Matchers.is(false), "ListItemGroup has border");
return this;
}

@JDIAction(value = "Assert that '{name}' has icon", isAssert = true)
public ListItemGroupsAssert icon() {
public ListItemGroupAssert icon() {
jdiAssert(element().hasIcon(), Matchers.is(true), "ListItemGroup does not have icon");
return this;
}

@JDIAction(value = "Assert that '{name}' has no icon", isAssert = true)
public ListItemGroupsAssert noIcon() {
public ListItemGroupAssert noIcon() {
jdiAssert(element().hasIcon(), Matchers.is(false), "ListItemGroup has icon");
return this;
}

@JDIAction(value = "Assert that '{name}' contains text '{0}'", isAssert = true)
public ListItemGroupsAssert containsText(String text) {
public ListItemGroupAssert containsText(String text) {
jdiAssert(element().getText(), Matchers.containsString(text));
return this;
}

@JDIAction(value = "Assert that '{name}' is a sub-group", isAssert = true)
public ListItemGroupsAssert subGroup() {
public ListItemGroupAssert subGroup() {
jdiAssert(element().isSubgroup(), Matchers.is(true), "ListItemGroup is not a sub-group");
return this;
}

@JDIAction(value = "Assert that '{name}' is not a sub-group", isAssert = true)
public ListItemGroupsAssert notSubGroup() {
public ListItemGroupAssert notSubGroup() {
jdiAssert(element().isSubgroup(), Matchers.is(false), "ListItemGroup is sub-group");
return this;
}

@JDIAction(value = "Assert that '{name}' is no-action", isAssert = true)
public ListItemGroupsAssert noAction() {
public ListItemGroupAssert noAction() {
jdiAssert(element().isNoAction(), Matchers.is(true), "ListItemGroup is not no-action");
return this;
}

@JDIAction(value = "Assert that '{name}' is not no-action", isAssert = true)
public ListItemGroupsAssert notNoAction() {
public ListItemGroupAssert notNoAction() {
jdiAssert(element().isNoAction(), Matchers.is(false), "ListItemGroup is no-action");
return this;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

public class ItemGroup extends UIListBase<ItemGroupAssert> implements HasTheme {

//Interface IsMultiple is not applicable here, as there is no "--is-multi"
// @todo #5298 Implement get selected items function Interface IsMultiple is not applicable here, as there is no "--is-multi"

@Override
@JDIAction("Is item '{0}' selected in {name}")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,30 @@
package com.epam.jdi.light.vuetify.elements.complex;

import com.epam.jdi.light.common.JDIAction;
import com.epam.jdi.light.elements.base.UIBaseElement;
import com.epam.jdi.light.elements.common.UIElement;
import com.epam.jdi.light.elements.interfaces.base.HasClick;
import com.epam.jdi.light.vuetify.asserts.ListItemGroupsAssert;
import com.epam.jdi.light.vuetify.asserts.ListItemGroupAssert;
import com.epam.jdi.light.elements.interfaces.base.HasColor;
import com.epam.jdi.light.vuetify.interfaces.HasIcon;
import com.epam.jdi.light.vuetify.interfaces.HasTheme;
import com.epam.jdi.light.vuetify.elements.common.ListItem;
import com.epam.jdi.light.vuetify.interfaces.IsFlat;
import org.openqa.selenium.By;

import java.util.List;
import java.util.stream.Collectors;

/**
* To see an example of Lists web element please visit
* https://vuetifyjs.com/en/components/list-item-groups/
*/

public class ListItemGroup extends UIBaseElement<ListItemGroupsAssert> implements HasClick, HasIcon, IsFlat, HasColor,
HasTheme {
public class ListItemGroup extends ListItem implements IsFlat {

@Override
public ListItemGroupsAssert is() {
return new ListItemGroupsAssert().set(this);
public ListItemGroupAssert is() {
return (ListItemGroupAssert) new ListItemGroupAssert().set(this);
}

@JDIAction("Get header item for {name}")
public ListItem header() {
return new ListItem().setCore(ListItem.class, core().find(".v-list-group__header"));
}

@JDIAction("Get if '{name}' is active")
Expand Down Expand Up @@ -49,6 +53,13 @@ public boolean isSubgroup() {
public boolean isNoAction() {
return core().hasClass("v-list-group--no-action");
}

@JDIAction()
public List<ListItem> items() {
return core().finds(By.cssSelector(".v-list-item:not(.v-list-group__header)"))
.stream().map(e -> new ListItem().setCore(ListItem.class, e))
.collect(Collectors.toList());
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@
*/
public class VuetifyList extends UIBaseElement<VuetifyListAssert> implements ICoreElement, HasTheme, HasElevation,
IsDense, IsFlat, HasRounded, IsShaped {

private final String groupLocator = ".v-list-group";
private final String itemLocator = ".v-list-item";


@Override
public VuetifyListAssert is() {
return new VuetifyListAssert().set(this);
Expand Down Expand Up @@ -60,7 +65,7 @@ public ListItem item(String title) {
* @return items as {@link WebList}
*/
protected WebList itemsWebList() {
return core().finds(".v-list-item");
return core().finds(itemLocator);
}

/**
Expand Down Expand Up @@ -118,17 +123,23 @@ public int size() {

@JDIAction("Get '{name}' groups")
public List<VuetifyListGroup> groups() {
return core().finds(".v-list-group").stream()
return core().finds(groupLocator).stream()
.map(e -> new VuetifyListGroup().setCore(VuetifyListGroup.class, e))
.collect(Collectors.toList());
}
@JDIAction("Get '{name}' group with '{0}' title ")
public VuetifyListGroup group(String title) {
return core().finds(".v-list-group").stream()
return core().finds(groupLocator).stream()
.map(e -> new VuetifyListGroup().setCore(VuetifyListGroup.class, e))
.filter(e -> e.header().text().equals(title)).findFirst().orElse(null);
}

@JDIAction("Get '{name}' group with '{0}' index ")
public VuetifyListGroup group(int index) {
return new VuetifyListGroup().
setCore(VuetifyListGroup.class, core().finds(groupLocator).get(index));
}

@Override
@JDIAction("Get if '{name}' is disabled")
public boolean isDisabled() {
Expand Down

1 comment on commit d6ad14b

@0pdd
Copy link
Collaborator

@0pdd 0pdd commented on d6ad14b Jan 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wasn't able to retrieve PDD puzzles from the code base and submit them to github. If you think that it's a bug on our side, please submit it to yegor256/0pdd:

set -x && set -e && set -o pipefail && cd /tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA && pdd -v -f /tmp/20240109-1597746-1bjc6 [1]: + set -e + set -o pipefail + cd /tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA + pdd -v -f...

Please, copy and paste this stack trace to GitHub:

UserError
set -x && set -e && set -o pipefail && cd /tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA && pdd -v -f /tmp/20240109-1597746-1bjc6 [1]:
+ set -e
+ set -o pipefail
+ cd /tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA
+ pdd -v -f /tmp/20240109-1597746-1bjc6

My version is 0.23.2
Ruby version is 3.1.4 at x86_64-linux
Reading from root dir /tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/Documents/Инструктаж для новичков.docx is a binary file (446393 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/allure.tgz is a binary file (17225855 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-bdd-tests/src/test/resources/json/test/data/Roman Contacts.json is a binary file (235 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-core/src/main/resources/META-INF/additional-jdi-light-configuration-metadata.json is a binary file (23000 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile/docs/android_name_uid.png is a binary file (171912 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile/docs/empty_chrome.png is a binary file (122037 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile/docs/run_and_power_up.png is a binary file (94371 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile/docs/sdk_path.png is a binary file (72405 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3/docs/android_name_uid.png is a binary file (171912 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3/docs/empty_chrome.png is a binary file (122037 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3/docs/run_and_power_up.png is a binary file (94371 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3/docs/sdk_path.png is a binary file (72405 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3-tests/docs/android_name_uid.png is a binary file (171912 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3-tests/docs/empty_chrome.png is a binary file (122037 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3-tests/docs/run_and_power_up.png is a binary file (94371 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3-tests/docs/sdk_path.png is a binary file (72405 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3-tests/src/main/java/utility-code.txt is a binary file (0 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3-tests/src/main/resources/ApiDemos-debug.apk is a binary file (4809449 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-selenium3-tests/src/main/resources/ApiDemosEspresso-debug.apk is a binary file (4852805 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-tests/docs/android_name_uid.png is a binary file (171912 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-tests/docs/empty_chrome.png is a binary file (122037 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-tests/docs/run_and_power_up.png is a binary file (94371 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-tests/docs/sdk_path.png is a binary file (72405 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-tests/src/main/java/utility-code.txt is a binary file (0 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-tests/src/main/resources/ApiDemos-debug.apk is a binary file (4809449 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-tests/src/main/resources/ApiDemosEspresso-debug.apk is a binary file (4852805 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-mobile-tests/src/main/resources/EpamIOSTestAPP.zip is a binary file (2977968 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-selenium3/src/main/resources/META-INF/additional-jdi-light-configuration-metadata.json is a binary file (22876 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/jdi-light-vuetify/src/main/resources/.gitkeep is a binary file (0 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/test-examples/jdi-bdd-no-po-tests/src/test/resources/json/page/objects/html5page.json is a binary file (145 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/test-examples/jdi-bdd-no-po-tests/src/test/resources/json/page/objects/pages.json is a binary file (129 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/test-examples/jdi-bdd-no-po-tests/src/test/resources/json/test/data/Roman Contacts.json is a binary file (213 bytes)
/tmp/0pdd20240109-14-3o3dd4/Z2l0QGdpdGh1Yi5jb206amRpLXRlc3RpbmcvamRpLWxpZ2h0LmdpdA/test-examples/jdi-bdd-no-po-tests/src/test/resources/json/test/data/Roman.json is a binary file (47 bytes)
Reading .github/workflows/debug.yml ...
Reading .github/workflows/main.yml ...
Reading .github/workflows/release.yml ...
Reading .gitignore ...
Reading Documents/1.txt ...
Reading LICENSE ...
Reading README.md ...
Reading clean project.bat ...
Reading config/checkstyle/checkstyle-noframes-sorted.xsl ...
Reading config/checkstyle/checkstyle.xml ...
ERROR: ERROR: config/checkstyle/checkstyle.xml; PDD::Error at config/checkstyle/checkstyle.xml:357: TODO must have a leading space to become a puzzle, as this page explains: https://github.com/cqfn/pdd#how-to-format
If you can't understand the cause of this issue or you don't know how to fix it, please submit a GitHub issue, we will try to help you: https://github.com/cqfn/pdd/issues. This tool is still in its beta version and we will appreciate your feedback. Here is where you can find more documentation: https://github.com/cqfn/pdd/blob/master/README.md.
Exit code is 1

/app/objects/git_repo.rb:73:in `rescue in block in xml'
/app/objects/git_repo.rb:70:in `block in xml'
/app/vendor/ruby-3.1.4/lib/ruby/3.1.0/tempfile.rb:317:in `open'
/app/objects/git_repo.rb:69:in `xml'
/app/objects/puzzles.rb:41:in `deploy'
/app/objects/jobs/job.rb:38:in `proceed'
/app/objects/jobs/job_starred.rb:32:in `proceed'
/app/objects/jobs/job_recorded.rb:31:in `proceed'
/app/objects/jobs/job_emailed.rb:33:in `proceed'
/app/objects/jobs/job_commiterrors.rb:33:in `proceed'
/app/objects/jobs/job_detached.rb:48:in `exclusive'
/app/objects/jobs/job_detached.rb:36:in `block in proceed'
/app/objects/jobs/job_detached.rb:36:in `fork'
/app/objects/jobs/job_detached.rb:36:in `proceed'
/app/0pdd.rb:531:in `process_request'
/app/0pdd.rb:367:in `block in <top (required)>'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1706:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1706:in `block in compile!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1019:in `block (3 levels) in route!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1037:in `route_eval'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1019:in `block (2 levels) in route!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1068:in `block in process_route'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1066:in `catch'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1066:in `process_route'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1017:in `block in route!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1014:in `each'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1014:in `route!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1138:in `block in dispatch!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1109:in `catch'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1109:in `invoke'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1133:in `dispatch!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:949:in `block in call!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1109:in `catch'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1109:in `invoke'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:949:in `call!'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:938:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8/lib/rack/deflater.rb:44:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-protection-3.0.6/lib/rack/protection/xss_header.rb:20:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-protection-3.0.6/lib/rack/protection/path_traversal.rb:18:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-protection-3.0.6/lib/rack/protection/json_csrf.rb:28:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-protection-3.0.6/lib/rack/protection/base.rb:53:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-protection-3.0.6/lib/rack/protection/base.rb:53:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-protection-3.0.6/lib/rack/protection/frame_options.rb:33:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8/lib/rack/logger.rb:17:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8/lib/rack/common_logger.rb:38:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:261:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:254:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8/lib/rack/head.rb:12:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8/lib/rack/method_override.rb:24:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:219:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:2018:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1576:in `block in call'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1792:in `synchronize'
/app/vendor/bundle/ruby/3.1.0/gems/sinatra-3.0.6/lib/sinatra/base.rb:1576:in `call'
/app/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8/lib/rack/handler/webrick.rb:95:in `service'
/app/vendor/bundle/ruby/3.1.0/gems/webrick-1.8.1/lib/webrick/httpserver.rb:140:in `service'
/app/vendor/bundle/ruby/3.1.0/gems/webrick-1.8.1/lib/webrick/httpserver.rb:96:in `run'
/app/vendor/bundle/ruby/3.1.0/gems/webrick-1.8.1/lib/webrick/server.rb:310:in `block in start_thread'

Please sign in to comment.