text:
e2e test framework poc needs more flexibility

So none of the networking conformance tests currently have levels. Only serving has some.
I think for serving a runtime conformance test will be structured as

Create a Service
Make a get request to get some info about the running environment
Run the levelled assertions against the returned info
Repeat step 3 until you have no more assertions

A problem I see is the info from step 2 needs to go to step 3. With the framework as is this is going to be cumbersome - especially if each levelled assertion has unique logic.
Originally posted by @dprotaso in https://github.com/knative-sandbox/reconciler-test/pull/30#discussion_r520992411

/assign @n3wscott

Another example would be the API operations for different types
https://github.com/knative/docs/blob/master/docs/serving/spec/knative-api-specification-1.0.md#service

Do you have an example test with code so I can understand?

If I was using https://github.com/knative-sandbox/reconciler-test/blob/master/pkg/test/context.go
I'd write it as follows
func TestService_APIOperations(t *test.T) {
  var s v1.Service = someTestService()

 t.Must("Create", func(t *test.T) {
      t.ServingClient.Create(...)
      ...
  })

  t.Must("Update", func(t *test.T) {
      t.ServingClient.Update(...)
      ...
  })

  t.Must("Get", func(t *test.T) {
      t.ServingClient.Get(...)
      ...
  })

  t.Should("Patch", func(t *test.T) {
      t.ServingClient.Patch(...)
      ...
  })

  t.Must("Delete", func(t *test.T) {
      t.ServingClient.Delete(...)
      ...
  })
}

I would assume that looks something like:
func StableAPIOpsFeature() *feature.Feature {
  f := new(feature.Feature)

  f.Stable("Service").
    Must("Create", func(ctx context.Context, t *test.T) {
        servingclient.Get(ctx).Create(...)
        ...
    })).
    Must("Update", func(t *test.T) {
      servingclient.Get(ctx).Update(...)
      ...
    }).
    Must("Get", func(t *test.T) {
      servingclient.Get(ctx).Get(...)
      ...
    }).
    Should("Patch", func(t *test.T) {
      servingclient.Get(ctx).Patch(...)
      ...
    }).
    Must("Delete", func(t *test.T) {
      servingclient.Get(ctx).Delete(...)
      ...
    })

    return f
}

We need to build some support code, like implement namespace scoped clients and inject them into context: like the tbd servingclient package.

the caveat is that each test should be independent of the previous. Because if you depend on ordering, it will fail, or it will be filtered out if only Should is run... etc

the caveat is that each test should be independent of the previous. Because if you depend on ordering, it will fail, or it will be filtered out if only Should is run... etc

In the prior example I have control over the test sequence since they naturally tie into golang's test lifecycle.
This is the point I'm trying to make - this separation makes this more cumbersome
ie. another example asserting which filesystem properties in our runtime contracts.
func TestRuntimePaths(gotest *testing.T) {
   t := globals.NewT(gotest)
   var s v1.Service = someTestService()

   t.ServingClient.Create(s)
   // once ready fetch it's runtime environment
  env := http.Get(s.Status.URL + "/runtime")

  for _, path := range runtimev1.MustFilesystemPaths {
    t.Must(path, checkPath(env, path))
  }

  for _, path := range runtimev1.MayFilesystemPaths {
    t.May(path, checkPath(env, path))
  }
}

bump

I am trading cumbersome with composability and decoupled tests.
I would write the TestRuntimePaths like this:
func TestRuntimePaths(t *testing.T) {
	ctx, env := global.Environment()

	// Use the existing helpers to make a KSVC.
	env.Prerequisite(ctx, t, features.ServiceIsCreatedAndReady(s))

	// once KSVC is ready fetch it's runtime environment
	env := http.Get(s.Status.URL + "/runtime")

  // RuntimePaths is the feature we are trying to test.
	env.Test(ctx, runtime.RuntimePaths(env))

	env.Finish()
}

// ...in a runtime features package...

func RuntimePaths(env http.Response) *feature.Feature {
	f := new(feature.Feature)

	s := f.Stable("RuntimePaths")

	for _, path := range runtimev1.MustFilesystemPaths {
		s.Must("have "+path , checkPath(env, path))
	}

	for _, path := range runtimev1.MayFilesystemPaths {
		s.May("have"+path, checkPath(env, path))
	}

	return f
}

This might look like more code, but what we can do is break down the thing we are trying to assert is a feature (the payload of the runtime contract) from the how we get that response. So with some edits to the test entry point, we can test the runtime or whatever to another way of getting that data, say, a kn environment result or something like that, or a CloudRun curl on another kind of endpoint.

The example above leads me to more questions/thoughts:
1) Use of Feature in lieu of a list of steps in Prerequisites
env.Prerequisite(ctx, t, features.ServiceIsCreatedAndReady(s))

Prerequisite accepting a Feature seems weird since there could be levelled requirements and/or feature state assertions that I wouldn't expect.
2) Generating state from prerequisite steps & using them in assertions
var s v1.Service = someTestService()
env.Prerequisite(ctx, t, features.ServiceIsCreatedAndReady(s))
rt := http.Get(s.Status.URL + "/runtime")

someTestService() in my mind just returns a v1.Service go struct. If that's the case is features.ServiceIsCreatedAndReady(s) meant to mutate s with the intent of setting a valid  s.Status.URL?
env.Prerequisite and env.Test both take unique contexts so it seems like there's no hand off of state between the two functions. Meaning Prerequisite doesn't allow for the context to be mutated.
This leads to two ways to consume dependencies for an assertion - closures (in your example above) and the context function argument that's originally passed to Test (which I've seen include clients/informers etc.).
I'm not advocating we let env.Prerequisite modify the context. In order for that to work the context keys need to be known by the prereq & assertion steps - which I'd argue is coupling them together. Maybe a workaround would be to dynamically create assertions with a context keys as input but :shrug:  this become fairly complex.
3) Coalescing of Features Steps
I was sold on the fact that we could describe features in a fluent style. I like this because having a central place to see all the aspects of a feature set is great. This is a pattern that originated from networking conformance.
ie. thus for a runtime conformance I'd like to write
func RuntimeV1Conformance() feature.Feature {
    f := new(feature.Feature)
    f.Stable("filesystem", TestRuntimePaths)
    f.Stable("http", TestRuntimeHTTP)
    f.Stable("http-upgrade", TestRuntimeHTTPUpgrade)
    // etc..
}

In the example the test setup/runner TestRuntimePaths has specific logic that's unique only to RuntimePaths. Given that I'm not sure we can still describe a holistic RuntimeV1Conformance feature if I needed to create unique services for different aspects of the runtime conformance.
It seems like I have two options:

Figure out how to use something like features.ServiceIsCreatedAndReady(s) N times in my test runner

con:

changing a test requires changes in two places
setting up N services (on a single context?) to be consumed by N different assertions requires coordination

Create the services in each assertion func(ctx.Context, t*testing.T)

con:

things that are written as steps can't be used here - ie. features.ServiceIsCreatedAndReady so there's going to be code duplication

4) t.Parallel()
Serving and Networking use t.Parallel() quite extensively and they're invoked at the feature state boundary. ie. Kingress/basic is parallel wrt. KIngress/websocket. I'm not sure how to do this with feature.Feature or why by default step assertions are all parallelized (https://github.com/knative-sandbox/reconciler-test/pull/52) cc @slinkydeveloper

I'm beginning to wonder if feature.Feature should be called something else - feature.Set because the stable/alpha/beta calls are scoped to a feature.

I'm not sure how to do this with feature.Feature or why by default step assertions are all parallelized (#52) cc @slinkydeveloper

@dprotaso since you want to parallelize all tests, why not? I'm not sure I get your question

@dprotaso since you want to parallelize all tests, why not? I'm not sure I get your question

Shouldn't test authors control the flow? What if assertions have side-effects on the remote object being tested?
This seems relevant to #3 - To guarantee test isolation I would have to change my feature definition either by:

Taking what would be in feature.Setup and moving it into every Step - ie. creating N Knative Services instead of one.
Creating duplicate feature.Feature definitions with different Steps on each

Shouldn't test authors control the flow? What if assertions have side-effects on the remote object being tested?

An assertion by definition shouldn't have a side effect right? Are you sure that particular assertion shouldn't live in the setup phase?

An assertion by definition shouldn't have a side effect right?

Yup - I agree.

Are you sure that particular assertion shouldn't live in the setup phase?

Ideally it should - but then I'm forced to split my feature.Feature definition. With the side effects being:

the same issue I mentioned above where some arguments are passed via closures and some via context
env.Test() doesn't run in parallel to other env.Test()  invocations - splitting features would actually slow things down

Ideally it should - but then I'm forced to split my feature.Feature definition

Can you provide a use case for that? It might help me reason on the issue

I mentioned it all here see point 2): https://github.com/knative-sandbox/reconciler-test/issues/37#issuecomment-733445763
Another hypothetical
kingress := new(feature.Feature)
//
kingress.Stable("websocket").Must("receive traffic", AssertWebSocketTraffic())
kingiress.Stable("http2").Must("receive traffic", AssertHTTP2Traffic())

If each Stable feature requires a different KIngress configuration where should they be setup?

Inside Assert*Traffic calls?

con: not really using feature.Setup anymore so you can't re-use steps

Setup on the feature?

con: all the assertions are block on all the KIngresses to be ready, how do you transfer the right ingress endpoint to the assertion?

Split the feature into two?

con: more boilerplate, tests run linearly unless you add more Test funcs

I mentioned it all here see point 2)

This is kinda similar to the discussion happening here: https://github.com/knative-sandbox/reconciler-test/issues/51. My understanding is that to generate state you should use Setup. If you need to generate state, then assert, then generate state and then assert again you need to develop 2 features.
I see this even more clearly in your sample with kingress, where yes there is more boilerplate, but it clearly shows how websocket and http2 testing should be 2 different features.
Maybe what might be useful is something like "feature template": in your case the setup and teardown is the same except (i guess) one step to trigger the state change to stimulate the kingress. But, assuming you create feature websocket and http2, you could mostly share the same setup and teardown.
So what we could do is to create a sort of "template" that you can use to define common setup and teardown for more features: the websocket and http2 features will eventually share the same kingress data plane feature template. But still, "at runtime", those features then are executed separately, so the setup and teardown steps are in fact repeated.

The name feature.Feature could be wrong, I have been more focused on how these things are composable and the signatures of the steps and feature providers.

Use of Feature in lieu of a list of steps in Prerequisites

Ville wanted a setup step that was external to the Test or Feature to get the env to a state that is required by orthogonal to the test you would like to preform. In Eventing this would be installing a class of Broker, in Serving this would be configuring the ingress type. To test out the usage I thought it would be handy to use feature.Feature (bikeshed the name) as a shortcut to make a env.Prerequisite in the same signature as env.Test, it is for the author, reporter and debugger's convence to make it clear what is being tested or asserted inside the Prerequisites phase is independent but required for the Test phase.

Generating state from prerequisite steps & using them in assertions

I think var s v1.Service = someTestService() should have been var s *v1.Service = someTestService() and it will work out.

This leads to two ways to consume dependencies for an assertion - closures (in your example above) and the context function argument that's originally passed to Test (which I've seen include clients/informers etc.).

The framework should provide the hooks but make no opinion on which way is best. For some cases having some magic thing in context might be the best, like a set of namespaced clients setup in some Prerequisite phase serving likes to use.

I'm not sure we can still describe a holistic RuntimeV1Conformance feature.

I don't think you can or want to. I would see this written as a series of Test calls on an environment with a list of features that are required to pass conformance:

// RuntimeV1Conformance
func TestRuntimeV1Conformance(t *testing.T) {
	ctx, env := global.Environment()

	env.Test(ctx, t, conformance.Feature1())
	env.Test(ctx, t, conformance.Feature2())
	env.Test(ctx, t, conformance.Feature3())
	env.Test(ctx, t, conformance.Feature4())
	<... etc>

	env.Finish()
}

The results of this will be collected into a report that is more easily consumable and understood because the Test phase focused on an aspect of conformance. (that is my hope)

RuntimeV1Conformance feature if I needed to create unique services for different aspects of the runtime conformance

I would see this as something like:
// RuntimeV1Conformance
func TestRuntimeV1Conformance(t *testing.T) {
	ctx, env := global.Environment()
	s := "ksvc-name"
	env.Precondition(ctx, t, conformance.GivenSerivce(s))

	env.Test(ctx, t, conformance.Feature1(s))
	env.Test(ctx, t, conformance.Feature2(s))
	env.Test(ctx, t, conformance.Feature3(s))
	env.Test(ctx, t, conformance.Feature4(s))
	<... etc>

	env.Finish()
}

t.Parallel()

Big plus one, we need to support this, the runner code is total PoC. I am trying to focus on the following things:

Features and Steps are venderable cross projects.
Several Features can be run on a single env.
StepFn has no external dependencies, even to the framework unless you are opting into some base feature.

I have ran into some struggles so far with the PoC. One being the timing and isolation of the Steps makes it hard to pass results, so the step and feature isolation cause you to think about how to compose the test so it has no or few dependencies. This results in each step having a bit more code than you might expect, but that also results in the steps being composable in new ways than you originally wrote them in, as an example:
// TestBrokerAsMiddleware
func TestBrokerAsMiddleware(t *testing.T) {
	t.Parallel()

	ctx, env := global.Environment(
		knative.WithKnativeNamespace(system.Namespace()),
		knative.WithLoggingConfig,
		knative.WithTracingConfig,
		k8s.WithEventListener,
	)

	// Install and wait for a Ready Broker.
	env.Prerequisite(ctx, t, features.BrokerGoesReady("default", "MTChannelBroker"))

	// Test that a Broker can act as middleware.
	env.Test(ctx, t, features.BrokerAsMiddleware("default"))

	env.Finish()
}

Here, I need a Broker to be ready, but the focus of the test is not a ready Broker. I wanted to write a feature that assumes for a ready Broker of a given name, I can pass events through it. This means that I can vendor the features and reuse this in other downstream repos can leverage this same test:
// <... In eventing-rabbitmq ...>
// TestBrokerAsMiddleware
func TestBrokerAsMiddleware(t *testing.T) {
	t.Parallel()

	ctx, env := global.Environment(
		knative.WithKnativeNamespace(system.Namespace()),
		knative.WithLoggingConfig,
		knative.WithTracingConfig,
		k8s.WithEventListener,
	)

	// Create a RabbitmqCluster in the env, the CO that creates the underlying RabbitMQ Broker (not knative).
	env.Prerequisite(ctx, t, rabbitfeatures.RabbitMQBrokerIsCreated())

	// Install and wait for a Ready Broker.
	env.Prerequisite(ctx, t, features.BrokerGoesReady("default", "RabbitMQBroker"))

	// Test that a Broker can act as middleware.
	env.Test(ctx, t, features.BrokerAsMiddleware("default"))

	env.Finish()
}

So the downstream repo has opt'ed to include this test, but they only have to add the test entry point, not the features. The reasoning here is likely the downstream needs to do some additional setup like above.

then generate state and then assert again you need to develop 2 features.

Then I'm confused by the feature state methods (Alpha, Beta, Stable etc.) on the Feature struct. To my third point above and following observation I think it's important to be able to go to a single place to see a group of related features together and their level of maturity. ie. like the KIngress example
A template approach would work - but I was pointing out in 2) that things neither clearly defined nor consistent

I would need to know more about KIngress to be able to answer in full, but I have been assuming a Feature tests a contained set of functionality, and variations would be passed down to it.
I think you can compose the test you are wanting to, and you will have to do a bit more work when trying to special case a particular feature of an implementation, if that is not generally testable by all implementations.

1) Use of Feature in lieu of a list of steps in Prerequisites

it is for the author, reporter and debugger's convence to make it clear what is being tested or asserted inside the Prerequisites phase is independent but required for the Test phase.

Whatever goes here shouldn't have state (alpha, beta, stable) or levels (must, should, may) decorations since those could be skipped via environment flags etc.
ie. What if I was only testing alpha features of a broker - the broker ready feature passed to a prereq wouldn't run
https://github.com/knative/eventing/blob/fe1b34c4c084eaca1f964e09bd791a428c7bb8cf/test/rekt/features/broker_feature.go#L42-L44
2) Generating state from prerequisite steps & using them in assertions

I think var s v1.Service = someTestService() should have been var s *v1.Service = someTestService() and it will work out.

The pointer doesn't change my interpretation - s still needs to be mutated or refetched to get additional info for the subsequent steps.
3) Coalescing of Features Steps

I'm not sure we can still describe a holistic RuntimeV1Conformance feature.

I don't think you can or want to. I would see this written as a series of Test calls on an environment with a list of features that are required to pass conformance:

We do this in networking currently and it good for discoverability. A side effect is diffs become very clear https://github.com/knative/networking/pull/277/files. Another example

RuntimeV1Conformance feature if I needed to create unique services for different aspects of the runtime conformance

I would see this as something like:
// RuntimeV1Conformance
func TestRuntimeV1Conformance(t *testing.T) {
	ctx, env := global.Environment()
	s := "ksvc-name"
	env.Precondition(ctx, t, conformance.GivenSerivce(s))

	env.Test(ctx, t, conformance.Feature1(s))
	env.Test(ctx, t, conformance.Feature2(s))
	env.Test(ctx, t, conformance.Feature3(s))
	env.Test(ctx, t, conformance.Feature4(s))
	<... etc>

	env.Finish()
}

I see only one service in this example. Also we want to group relevant conformance features to be run together to make it easier for downstream folks to run the correct set of tests. Right now in networking this done using an exported RunConformance function.

The results of this will be collected into a report that is more easily consumable and understood because the Test phase focused on an aspect of conformance. (that is my hope)

Can you elaborate?

I would need to know more about KIngress to be able to answer in full, but I have been assuming a Feature tests a contained set of functionality, and variations would be passed down to it.
I think you can compose the test you are wanting to, and you will have to do a bit more work when trying to special case a particular feature of an implementation, if that is not generally testable by all implementations.

I would need to know more about KIngress to be able to answer in full, but I have been assuming a Feature tests a contained set of functionality, and variations would be passed down to it.

It's conformance so there's are no variations on the features being tested. The only thing that differs is the ingress installation and maybe configuring some global test properties (ie. does DNS work, which ingress class etc.)

I have made several issues to continue the discussion in the forks we have made:
for 1):
Framework should report Prerequisite features with Asserts #64
for 2):
Framework needs to help test authors understand how to pass state between steps #66
for 3):
Framework needs a way to group Features into Sets #65

The results of this will be collected into a report that is more easily consumable and understood because the Test phase focused on an aspect of conformance. (that is my hope)

Can you elaborate?

I think we need to define this a bit more. The thinking is the runner can get metadata out of the feature and generate data around the run of the test and conformance is somehow different, but I think we are waiting for the conformance group to ask for data.

Tagging @nak3 @ZhiminXiang @tcnghia - can someone with networking start taking a look at the current framework and the open issues Scott created.
It may be worth doing a small POC with a single KIngress feature.

authors: dprotaso n3wscott slinkydeveloper

repo: knative-sandbox/reconciler-test


text:
Port Gitlab source to adapter/v2

Problem
Gitlab source still uses knative.dev/eventing/pkg/adapter module, which uses the cloudevents/sdk-go v1. We should port it to knative.dev/eventing/pkg/adapter/v2, which uses the new sdk-go
Persona:
Event developer/Event producer
Exit Criteria
Gitlab source should not use anymore knative.dev/eventing/pkg/adapter
Time Estimate (optional):
1

/assign

source: gharchive/issue

repo: knative/eventing-contrib

license_type: permissive

license_source: bigquery


text:
Removal of sources-controller after 0.12.0

Based on the change here: https://github.com/knative/eventing/pull/2448
It is time for operator to shine, in terms of upgrade without manual interruption.

I can implement this

/assign aliok

@aliok PLZ be advised that I am thinking of extending the scope of our tests-on-latest-eventing t verify the upgrade: https://github.com/knative/eventing-operator/pull/93. Hope we do not overlap our work.

Some notes:

Reconciliation will be updating existing resources and create new resources
It won't be able to delete the old resources (that is removed in eventing manifest)

So, I wrote a small script where I feed the 0.12 manifest (gsutil cp gs://knative-releases/eventing/previous/v0.12.0/eventing.yaml ./) and latest nightly manifest (gsutil cp gs://knative-nightly/eventing/latest/eventing.yaml ./) to make sure we will cover all resources that were deleted.
This is the output:
Unable to find 1.2.0 resource in nightly: apiVersion:v1 kind:ServiceAccount name:eventing-source-controller
Unable to find 1.2.0 resource in nightly: apiVersion:rbac.authorization.k8s.io/v1 kind:ClusterRole name:knative-eventing-source-controller
Unable to find 1.2.0 resource in nightly: apiVersion:rbac.authorization.k8s.io/v1 kind:ClusterRoleBinding name:eventing-source-controller
Unable to find 1.2.0 resource in nightly: apiVersion:rbac.authorization.k8s.io/v1 kind:ClusterRoleBinding name:eventing-source-controller-resolver
Unable to find 1.2.0 resource in nightly: apiVersion:apps/v1 kind:Deployment name:sources-controller

These are the things we need to delete in the operator

More changes needed after https://github.com/knative/eventing/pull/2519

authors: aliok houshengbo

repo: knative/eventing-operator


text:
[main] Upgrade to latest dependencies

GKE fixes in hack -dprotaso
/cc knative/serving-writers knative/eventing-writers
/assign knative/serving-writers knative/eventing-writers
Produced by: knative-extensions/knobots/actions/update-deps

/retest
/lgtm
/approve

source: gharchive/pull-request

authors: dprotaso knative-automation

repo: knative/pkg


text:
Renaming Importer to Source

Renaming Importer metrics to Source

/assign @yanweiguo

/lgtm
/approve

/assign @srinivashegde86 for test/OWNERS approval

/lgtm
/approve

authors: nachocano vaikas-google yanweiguo


text:
Grab bag of minor improvements

This is a grab bag of minor fixes that things slightly easier on me:

expand range of transformers allowed (I'm trying to get to GHC 8 via stack/lts-7)
unit tests are now much easier to add
add trivial stack.yml
add test cases which are expected and known to fail. A sort of TODO list (I plan on working on these, and it's a nice place to add future ones)
bump version number and copyright year
clean up warnings and linter warnings in tests
bug fix+tests: heredoc logic is wrong

I can split these into multiple PRs or cut out commits that you don't like: let me know what you prefer!

Added one more bug fix: the logic in heredoc was wrong. Also included tests.
The logic was reversed - it's the quoted heredoc that does no expansion. Here's the spec from man bash:
The format of here-documents is:
          <<[-]word
                  here-document
          delimiter

   No parameter and variable expansion,  command  substitution,  arith-
   metic expansion, or pathname expansion is performed on word.  If any
   characters in word are quoted, the delimiter is the result of  quote
   removal  on  word,  and  the  lines  in  the  here-document  are not
   expanded.  If word is unquoted, all lines of the  here-document  are
   subjected  to  parameter expansion, command substitution, and arith-
   metic expansion, the character sequence \<newline> is ignored, and \
   must be used to quote the characters \, $, and `.

Thanks a lot for the PR! :D
I think it's pretty clear that I haven't touched this library since Stack was released, but I'll try to build it again and review the PR this weekend (or Monday).

Thanks! I took a look at fixing the arithmetic and it's way beyond my understanding of parsec. If you're interested in fixing that, that would be very awesome 😁. If I had to guess, it seems to look for 4 sets of parens but unsure.

I'll take a look. It might be related to #15

My guess though is that the parser at https://github.com/knrafto/language-bash/blob/master/src/Language/Bash/Parse/Word.hs#L157 is the culprit

Fixed it! I can't push to your branch, but here's a patch:
From 2b34962d7ed4bb1c5e874b164da6d8cfb7e98d8f Mon Sep 17 00:00:00 2001
From: Kyle Raftogianis <knrafto@gmail.com>
Date: Sun, 25 Sep 2016 20:21:29 -0700
Subject: [PATCH] Fix parsing of arithmetic expressions (fixes #15)

---
 src/Language/Bash/Parse/Word.hs |  6 +++---
 tests/Tests.hs                  | 16 +++++++++++-----
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/Language/Bash/Parse/Word.hs b/src/Language/Bash/Parse/Word.hs
index 111e606..9e407b0 100644
--- a/src/Language/Bash/Parse/Word.hs
+++ b/src/Language/Bash/Parse/Word.hs
@@ -154,10 +154,10 @@ backquote = Backquote <$> matchedPair '`' '`' False escape

 -- | Parse an arithmetic expression.
 arith :: Stream s m Char => ParsecT s u m String
-arith = B.toString <$> parens <?> "arithmetic expression"
+arith = B.toString <$> arithPart <?> "arithmetic expression"
   where
-    parens = B.many inner
-    inner  = B.matchedPair '(' ')' parens
+    arithPart = B.many inner
+    inner     = B.noneOf "()" <|> B.char '(' <+> arithPart <+> B.char ')'

 -- | Parse a parenthesized substitution.
 subst :: Stream s m Char => ParsecT s u m String
diff --git a/tests/Tests.hs b/tests/Tests.hs
index d5fcab9..4a2b01c 100644
--- a/tests/Tests.hs
+++ b/tests/Tests.hs
@@ -91,15 +91,21 @@ unittests = testGroup "Unit tests"
                   heredocDelim = "EOF",
                   heredocDelimQuoted = True,
                   hereDocument = expandString "asd\\`\n"}])
-
+  , tp "echo $((2 + 2))"
+       (Command
+        (SimpleCommand [] [expandString "echo", [ArithSubst "2 + 2"]])
+        [])
+  , tp "((2 + 2))"
+       (Command (Arith "2 + 2") [])
+  , tp "echo $(((2 + 2)))"
+       (Command
+        (SimpleCommand [] [expandString "echo", [ArithSubst "(2 + 2)"]])
+        [])
   ]

 failingtests :: TestTree
 failingtests = testGroup "Failing tests" (map expectFail
-  [
-    tp "echo $((2+2))"
-       (Command (Arith "2 + 2") [])
-  ])
+  [])

 tests :: TestTree
 tests = testGroup "Tests" [properties, unittests, failingtests]
--
2.7.4 (Apple Git-66)

The rest of the PR looks good. I'll merge and add the arith fix, and then release on Hackage.
Thanks for your help!

Thanks for the review and the fix!!

authors: knrafto pbiggar

repo: knrafto/language-bash

license_source: github-api


text:
Async improvements

Check: https://developers.home-assistant.io/docs/asyncio_working_with_async/
E.g. need to add some await when pulling states for price and energy.

no need

repo: knudsvik/EnergyScore

license: MIT


text:
How are you so awesome?

This is a bug that needs immediate solving. Are you simply a mountain of raw programming power, or did you do some automated translation and then fill in the gaps? I mean even if the latter, still a mountain of raw programming power.
Sorry to open a bug ticket for such a stupid reason but seriously this is a great find. Hopefully now I can kiss IKVM goodbye.

You're absolutely right. This library is a work of art, and it is way too obscure and hard to find.

Wow!! I am very happy to see the compliments. I worked thousands of hours on this project, something close to 6 months of work, just for fun and curiosity, when I started, I had no knowledge about NLP, I just wanted to learn.
All code that exists was written by hand, without tools, I was simply solving one problem after another, to the point of being 100% compatible with the original version in Java.
I'm just passionate about programming!

authors: TechnikEmpire TheQuack45 knuppe

repo: knuppe/SharpNL


text:
Fix kind image loading for MacOS

See: https://github.com/kubernetes-sigs/kind/pull/2957
Fixes test following #1054

@cpanato @imjasonh Will this MR be merged ? I am running into the same issue when trying to use Ko on a M series mac

authors: aidy psankar

repo: ko-build/ko


text:
Improving the Koa ecosystem by moving all Koa modules to the koajs organization!

With GitHub's new organization administration, I want to try moving all koa middleware/plugins to the org. The goals are:

To have shared maintenance of all code.
Have all middleware/plugins be in one location.
Create teams so everyone knows who to ask for help.
Allow members to create repos within the organization.

I'm not sure how this will work. I remember last time, you had to be an owner of the organization for you to transfer a repository to an organization.
The steps will be something like:

Let us know what repository you'd like to transfer
We'll create a team for that repository if there isn't one yet
We'll add that repository to that team
We'll add you to that team

If anything, just transfer the repository to me and I'll add it to the organization. Comment here so I remember to add it to the organization! Let me know if anyone wants to transfer any repositories.
First one i'd like to transfer is koa-convert :)
NOTE: IF YOU'RE IN THIS ORGANIZATION, PLEASE SETUP 2-FACTOR AUTHENTICATION!

Agree! I will transfer all koa relate middlewares/plugins to koajs org.

I want to transfer coderhaoxin/koa-redis-cache to this org. Maybe cache team is suitable.

@coderhaoxin are you able to transfer? if not, what's the error message?

I'd like that, too. We can manage teams with an organization and this makes things easier for people to find good quality (and actively maintained) middlewares.

I'd transfer https://github.com/m4nuC/async-busboy if that makes sense.

@m4nuC It seems that async-busboy is not a koa middleware >_<

I don't think it makes sense to transfer async-busboy since its application isn't tied to Koa.

@haoxin yes just a module (It's basically co-body for multipart with koa2 support). It could be made a middleware if that makes more sense.
On 18 Jan 2016 13:11, haoxin notifications@github.com wrote:
@m4nuChttps://github.com/m4nuC It seems that async-busboy is not a koa middleware >_<
—
Reply to this email directly or view it on GitHubhttps://github.com/koajs/koa/issues/638#issuecomment-172427379.

@jonathanong Do we really want all middleware that works in the org though? Doesn't having it in the org signify that the org is going to maintain it? Just because it works doesn't mean it's maintained.

some that would be nice in the org...

koa-graphql @chentsulin
koa-bearer-token @chentsulin
koa-jwt @stiang
koa-joi-schema @simplyianm

We could vote on whether a module is deemed worthy of being in the org or not

not sure if github sends notifications for @mentions on edits/updates so here are some more :P

koa-resourcer @aheckmann
koa-router @alexmingoia

We could vote on whether a module is deemed worthy of being in the org or not
fair enough, this can get messy in threads. maybe we could get a survey platform? not sure what's good out there... if anyone knows, throw around some suggestions :)

@jonathanong
When I try to transfer koa-redis-cache to koajs, cache isn't in the teams checklist .

^ Maybe it's a secret team for some odd reason... :P

Great idea, I’d be happy to transfer koa-jwt. @jonathanong, can you please confirm that you want koa-jwt in the org?

@coderhaoxin but you're in the team and see it, right?
@stiang i'll let others decide that. i don't understand JWT :)

+1 from me :+1:

@jonathanong Got it, but I’m not really sure who is authorized to say whether I should transfer koa-jwt :) @tejasmanohar, you have already requested it, and I see that you are part of the koajs org. Are you in a position to OK the transfer?

Nah, let others vote on it and an Owner (who can actually create teams + transfer) decide :)

:+1: for the idea

:+1: for a voting system. This will also provide insight of what is actually being used (i.e. I didn't even know about koa-jwt!)

what about this: if more than one person wants to maintain it (ex. if someone wants to help @stiang maintain that repository), then it's in.

also, if someone could figure out how to easily transfer repos to the org, that woudl be great. otherwise, you can transfer it to me (or another owner) and we'll transfer it here

if more than one person wants to maintain it (ex. if someone wants to help @stiang maintain that repository), then it's in.

@jonathanong :+1: I agree.
@stiang I'm all in to help maintain koa-jwt so you can transfer. My projects depend on it anyways :P

sweet. @stiang @tejasmanohar added you both to a new @koajs/jwt team. @stiang if you have trouble transferring it over to the org, transfer it to me and i'll transfer it to this org.

@jonathanong Great! I’ve transferred it now, looks like it’s already available at https://github.com/koajs/koa-jwt
I suppose it should be renamed to just "jwt" to adhere to the naming scheme used by koajs. Also, although I was presented with a list of koajs teams to give permission to, the koa-jwt group was not among them, so I currently don’t have write access to the repo. Could you please add the koa-jwt team manually?
@tejasmanohar Very happy that you are willing to help! I’ve fallen behind on PRs and issues lately, so the project could really benefit from some fresh attention.

interesting. when you transferred it over, it was added to no teams, so i had to add it to a team manually.

Yeah, I could have selected another team, but since the relevant one wasn’t displayed I didn’t add it to any. I tried reloading the page and retrying the transfer again, but I still got just a subset of the koajs teams to select from. Not sure what’s going on there.
I renamed the repo to "jwt".

If I am a member of a team, am I free to add new teams as well? For example, we have a few koa projects and middleware over at gh://pebble but I wouldn't want to move anything if I can't bring several developers along with it. Does it make sense to (1) create a Pebble team and add people and repos or does it make more sense to (2) stay distributed just leave repos where they are? I'm leaning towards option 2.

I don't mind the idea of just everyone having access, if people do weird shit it'll just self-correct haha. That said I don't see a huge problem with using the wiki to list projects, that's still a more condensed view than browsing koajs/*

@tj @jonathanong can you guys add me to @koajs and so I can have collab on https://github.com/koajs/ratelimit?  I rewrote it the other day and I want to push it up and release a new major version for koa@next :+1: (it even has support for whitelist/blacklist, and all tests pass with flying sparkles :sparkles:)

@jonathanong How does moving popular Koa middleware into this org impact the general guidelines we already follow with repos in this org? For example, is it ok to transfer a middleware that's using Babel?
@niftylettuce I don't think we should merge that PR yet if koa-convert does the trick. That's the general procedure that all the rest of the middleware in this org has been following.

i don't care about code style as long as you have a linter to enforce one.
middleware should be transpiled before publishing anyways, at least for node v4+. i don't see why you need to write middleware that needs to be transpiled though.

A transpiler should not be required when using a middleware; it should only be application-specific. That being, I personally don't care if one is used, as long as npm install does not pull Babel or anything like that as dependency.

@jonathanong ah ok. fair enough. @yanickrochon yep, I didn't mean including the full babel-runtime in the package's distribution or anything like that but precompiling instead. that said, I thought we decided not to use Babel in middleware in this org so I thought I'd mention that this may be an issue when/if we transfer external middleware here :)

@tejasmanohar all good :smile:

@jonathanong we can contribute koa-pagination and koa-requestid. Additionally, we are preparing the release of an error mapper which allows registering different mappers to process each error class differently.
@thomseddon might be open to transfer koa-oauth-server, which we currently help maintain too.

I see many people jumping in here, advocating for their projects... and while it's legit, may I suggest to all, no offense intended, that the most downloaded (i.e. popular) get's pulled into the koajs organisation first? I too have koa-* middleware and one of them has more downloads than some proposed here. Yet, I consider that some middlewares should be promoted first. Like koa-gzip, koa-cors, koa-proxy, koa-timeout, koa-passport, etc.
m2c

I’d be happy to transfe:
koa-errorhandler @jonathanong
koa-ip @jonathanong
koa-mongo @jonathanong
koa-scheme @jonathanong
koa-router-validator @jonathanong
koa-router-cache @jonathanong
co-cache @jonathanong
Tip: you can use npm-user-downloads check your packages downloads ranking.

@yanickrochon I think we should take this opportunity not to find which packages have more downloads than the others but to build consensus around them and improve the whole koa ecosystem. I'd be happy to work together on any of the ones I mentioned in case multiple ones from the community are available for the same purpose. Sometimes the multitude of packages on npm comes from the horrible search alone :)

@ruimarinho oh, but I totally agree! My point was that I don't want everybody promoting their own koa-* repositories just for the sake that it has "koa-" as prefix! It's more of a prevention notice, so we don't need to trigger any rejection complex or whatever (LOL)
That being said, usually, the most used (i.e. downloaded) are the ones that should be maintained first (logically). There are cases, however, where you are right and we should take this opportunity to correct, or influence the use of a package over another. For example, there are a few caching middlewares for koa already, some of them perform almost the same thing.
All and all, my point is that community approved packages should be promoted first, so we don't end up with duplicated packages offering the same features yet again.

@yanickrochon agreed! Main areas where I believe there is quite some overlap are caching, routing and error handling.

i've setup some teams here: https://github.com/orgs/koajs/teams

if you want to help with some teams, let me know
if you think the teams could use better organization (new team, add a module, etc) let me know

i'm sure some modules, even in the org, are not properly organized. looking at the teams might help you guys think about other modules to add to the org!

also i noticed a lot of PRs for Koa v2 support. if you see one and want to help, let me know. i don't plan on touching those PRs myself for a while.

@jonathanong we (Pebble) have a few repos we'd like to transfer. You want me to transfer to you first or just directly to koajs?
https://github.com/pebble/koa-resourcer
https://github.com/pebble/koa-joi-router
https://github.com/pebble/koa-resourcer-docs
https://github.com/pebble/koa-bunyan-logger

@aheckmann you're an owner you should be able to transfer yourself

(to koajs)

cool, will do. thanks

I can transfer https://github.com/tunnckoCore/koa-ip-filter if you want. I have few more, but they are very outdated and I'm trying to update them soon. Now i'm working on total refactor of koa-better-body, using koa-body-parsers under the hood.

https://github.com/koa-modules/ ?

@fundon It's better to give a list you want to transfer, not a org link :smile:

@coderhaoxin Ok :smile:

Great idea, I’d be happy to transfer koa-generator. @jonathanong @coderhaoxin

@fundon @coderhaoxin's an owner so he can transfer those modules over
@i5ting :+1: for the generator because we don't have one. anyone else willing to help maintain it?

@i5ting  Could you translate Chinese into English in the koa-generator/Readme?
(Or I can do that several days later :smile:)

@coderhaoxin 哈哈，一共也没几个中文，我抽空就整理了，目前测试还差一些，在补充呢 https://github.com/17koa/koa-generator

@fundon Some modules are duplicate! Such as:
koajs/locales vs koa-modules/i18n for i18n
koajs/static vs koa-modules/serve-static
koajs/override-method vs koa-modules/methodoverride
That will be confused for the users, IMO :)

@coderhaoxin Should we add more detail for them?
Suggestions?

I want transfer my middleware webpack-koa2-middleware to koa community.

I'm going to transfer:
https://github.com/tunnckoCore/koa-better-body
https://github.com/tunnckoCore/koa-better-serve
https://github.com/tunnckoCore/koa-better-ratelimit (v3 in progress, sry there's no readme currently)
https://github.com/tunnckoCore/koa-better-router
https://github.com/tunnckocore/koa-rest-router
https://github.com/tunnckoCore/koa-ip-filter
As soon as possible. :)

It's only a testing framework but I don't know if you guys are interested in having:
https://github.com/chrsalx/koa-test.
I would gladly transfer.

authors: aheckmann chrsalx coderhaoxin fengmk2 fundon i5ting iyuq jonathanong m4nuC niftylettuce nswbmw ruimarinho stiang stojanovic tejasmanohar tj tunnckoCore yanickrochon

repo: koajs/koa


text:
Incorrect Efficientnets' FLOPs in ImageNet Classification Leaderboard

Hi, I think in ImageNet Classification Leaderboard, Efficientnet-B7' FLOPS should be 37G (37B in the paper) instead of 37000G. Same for other versions.

+1

It should be 0.37 because the column is in GFLOPS

repo: kobiso/Computer-Vision-Leaderboard


text:
kodadot.xyz not loading in nova wallet

What happened?
When trying to open kodadot.xyz in Nova Wallet DApp browser it is not loading. Error from the dev console is attached.

Please reproduce in steps

Open Nova Wallet app
Go to Browser tab
Put "kodadot" into the search field
Tap on found KodaDot option
Browser is opened but nothing loads

Expected Behavior
DApp browser for KodaDot is loaded and wallet account is requested
What browsers are you seeing the problem on?
Mobile iOS Safari (WebKit)
At which address did you encounter bug?
kodadot.xyz
Are you logged in?
No
Which wallet you are using?
Nova Wallet
At which chain did you encounter bug?
Basilisk, MoonSama, RMRK
Screenshots
https://user-images.githubusercontent.com/570634/214567060-eef8921d-4aa2-4b9e-81c9-15589d97de1d.MP4
Relevant log output
No response
Payment link for reward
No response
Code of Conduct

[X] I agree to follow this project's Code of Conduct

Yeah not working on iOS probably. I tried it too on my iPhone.

Hey @ERussel is this still thing? We did few updates recently. I don't have iOS tho.

Hey @yangwao still can reproduce on iOS. I think it is related to some part of the code that treats Safari with polkadot js extension at the same time in the wrong way.

hey @ERussel if you can check now, it should be available on https://beta.kodadot.xyz

authors: ERussel JustLuuuu yangwao

repo: kodadot/nft-gallery


text:
#2344 Rework navbar

Thank you for your contribution to the KodaDot NFT gallery.
👇 _ Let's make a quick check before the contribution.
PR type

[ ] Bugfix
[ ] Feature
[x] Refactoring

What's new?

[x] PR closes #2344
[ ]

Before submitting Pull Request, please make sure:

[x] My contribution builds clean without any errors or warnings
[x] I've merged recent default branch -- main and I've no conflicts
[x] I've tried to respect high code quality standards
[x] I've didn't break any original functionality
[x] I've posted a screenshot of demonstrated change in this PR

Optional

[ ] I've tested it at </rmrk/collection/26902bc2f7c20c546a-1FVG7>
[ ] I've tested PR on mobile and everything seems works
[ ] I found edge cases
[ ] I've written some unit tests 🧪

Had issue bounty label?

[x] Fill up your KSM address:
Payout

Community participation

[x] Are you at KodaDot Discord?

Screenshot

[x] My fix has changed something on UI; a screenshot is best to understand changes for others.

@roiLeo doneee

Doesn't take me anywhere :|
https://user-images.githubusercontent.com/5887929/153859039-058ef7cc-8117-4fb0-a390-1173b6dc49ac.mov

Doesn't take me anywhere :|
Screen.Recording.2022-02-14.at.12.49.00.mov

found the issue, fixing it

@yangwao check now

love you! 😘
pay 200 usd

😍 Perfect, I’ve sent the payout
💵 $200 @ 161.6 USD/KSM ~ 1.238 $KSM
🧗 EzGc4s9PgCPx1YnF3fqzhLzVHpHMTL4LWPScwpDrR8JKgSU
🔗 0x0f683cefd64ee30ab53b073df12d9707b4c7ba07fb225984257d00d9c993d093
🪅 Let’s grab another issue and get rewarded!
🪄 github.com/kodadot/nft-gallery/issues


text:
docs: updated style_guide

Thank you for your contribution to the KodaDot - One Stop Shop for Polkadot NFTs.
👇 __ Let's make a quick check before the contribution.
PR Type

[ ] Bugfix
[ ] Feature
[ ] Refactoring
[x] Documentation related to #7106

Context

[ ] Closes #<issue_number>
[ ] Requires deployment <snek/rubick/worker>

Before submitting pull request, please make sure:

[x] My contribution builds clean without any errors or warnings
[x] I've merged recent default branch -- main and I've no conflicts
[x] I've tried to respect high code quality standards
[x] I've didn't break any original functionality

Optional

[ ] I've tested it at </ksm/collection>
[ ] I've tested PR on mobile
[ ] I've written unit tests 🧪
[ ] I've found edge cases

Did your issue had any of the "$" label on it?

[x] Fill up your DOT address: Payout

Community participation

[ ] Are you at KodaDot Ecosystem Telegram?

Screenshot 📸

[ ] My fix has changed something on UI; a screenshot is best to understand changes for others.

Copilot Summary

🤖 Generated by Copilot at ec90a29
Updated STYLE_GUIDE.md to fix errors and enhance readability.

🤖 Generated by Copilot at ec90a29

Style guide refined
sentence, example, format
Cut like autumn leaves

pay 10 usd

😍 Perfect, I’ve sent the payout
💵 $10 @ 4.25 USD/DOT ~ 2.353 $DOT
🧗 13rFRPVKjJzQXVC8ZqHZv5YMmwmk4MU7z4HeYk218hEMpQXH
🔗 0x27e11c7b0e13c2027faa9fc9b688a601194ed26fc93bd47c40e66cc790148651
🪅 Let’s grab another issue and get rewarded!
🪄 github.com/kodadot/nft-gallery/issues


text:
Correct the link for Getting Started with SwiftUI Course in README.md

Correct the link for Getting Started with SwiftUI Course in README.md

Dear @jellodiil ,
I have a minor update link for "Getting Started with SwiftUI Course" in README.md. Could you please help me to review it?
Thanks,
Lam


text:
Fix typo in readme

Hope this saves someone else some time.

Thanks @mikesplain! Sorry for slow reaction, I must have missed a notification on this 😇 😇 😇

Np!

authors: mikesplain rjeczalik

repo: koding/vagrantutil


text:
[plugin/tiling] ToogleWindow function don't check for floating window

Edit: Second time I open an issue without typing a word XD
But basically the ToggleWindow function don't check if the window passed is floating, this can lead to crashes when calling one of the function on one of these. Obviously one shouldn't call these function floating windows but it can happen by pressing the wrong binding etc.. and we should probably not crash. Specifically in many places it check for (!Node && !Node->Parent) leading to a crash

Uh, do you have a line of code or steps to reproduce a crash? I don't see a particular problem in the ToggleWindow function. Probably just something I'm overlooking.

chunkc window --toggle float
chunkc window --toggle split

on the same window produces one reliably.

Well that is a major fuckup, wonder how late it was when I wrote that line of code.
It's supposed to be if(!Node || !Node->Parent) so we can short-circuit.

I have tested this and it should now be fixed.

Marking this as a bug even tho it is fixed, for future references.

authors: choco koekeishiya

repo: koekeishiya/chunkwm

license: mit


text:
Tools like PopClip do not work any more

Since #85 and the removal of menu-fix I cannot use PopClip any more. I suspect other tools relaying on an interactive overlay may be broken as well. kwm switches to the PopClip application and thereby losing the context to act on.

I really hate the layer system implemented in OSX..
Will see if something can be done about this in the future.

Thanks, because until there is a fix I need to unload kwm.

I have a fix working atm, that still allows for menubar/dock/context menus to work, but I'm not sure if it may break focusing of other window types.
Basically it has to do with:
 enum _CGCommonWindowLevelKey {
   kCGBaseWindowLevelKey         = 0,
   kCGMinimumWindowLevelKey      = 1,
   kCGDesktopWindowLevelKey      = 2,
   kCGBackstopMenuLevelKey       = 3,
   kCGNormalWindowLevelKey       = 4,
   kCGFloatingWindowLevelKey     = 5,
   kCGTornOffMenuWindowLevelKey  = 6,
   kCGDockWindowLevelKey         = 7,
   kCGMainMenuWindowLevelKey     = 8,
   kCGStatusWindowLevelKey       = 9,
   kCGModalPanelWindowLevelKey   = 10,
   kCGPopUpMenuWindowLevelKey    = 11,
   kCGDraggingWindowLevelKey     = 12,
   kCGScreenSaverWindowLevelKey  = 13,
   kCGMaximumWindowLevelKey      = 14,
   kCGOverlayWindowLevelKey      = 15,
   kCGHelpWindowLevelKey         = 16,
   kCGUtilityWindowLevelKey      = 17,
   kCGDesktopIconWindowLevelKey  = 18,
   kCGNumberOfWindowLevelKeys    = 19

Cool, thank you very much for the quick turnaround! It appears to work for me.

authors: herrbischoff koekeishiya

repo: koekeishiya/kwm


text:
Added table styles

Table styles added. Closes #5!

I made some minute changes. Thanks so much! Ready to ship?

Changes look great! :+1:

:shipit:

authors: gavinhenderson kognise


text:
v3.0.1

testnet params and checkpoints

New testnet parameters

repo: koh-gt/ferrite-core


text:
"pam_authenticate failed" what drives this message?

2019-10-30 15:51:03.239 ERROR 20613 --- [nio-8443-exec-4] o.o.a.s.CustomAuthenticationProvider     : PAM authentication failed: pam_authenticate failed : Authentication failure -- org.jvnet.libpam.PAMException: pam_authenticate failed : Authentication failure
	at org.jvnet.libpam.PAM.check(PAM.java:106)
	at org.jvnet.libpam.PAM.authenticate(PAM.java:124)

Getting this in my program.   Tryied on three different linux OS same result.   Can't seem to figure out what this message is telling me.   Did I miss a step somewhere?
pamtester -v login **** authenticate
This works... but fails via the java program running as the same user.
Tried on Fedora 27, Fedora 29, even a Oracle Linux 7 I had kicking around.

ok finally found the problem.    Never fails I search at a problem but the minute I have to document it into an issue like this I find it.
So my problem was this:
            Collection<? extends GrantedAuthority> authorities = Collections.singleton(new SimpleGrantedAuthority("ROLE_USER"));
            return new UsernamePasswordAuthenticationToken(authentication.getPrincipal(),
                                                           authentication.getCredentials(),
                                                           authorities);

vs
                                                           authentication.getCredentials());

Without the ROLES at the end it authenticates once fine (which I missed in the logs) then blanks out the password.  Then tries a second attempt with a null password.  Which is what I saw above.   When it was a wrong password the thing would fail on first try.
So resolution... pay attention to the logs more closely.      Posting here in case anyone else falls into the same trap but the issue can be closed.


text:
v1.8.8 弹幕菜单显示不全

这个。

隔壁前端🐏了没来，来了我问问他要怎么解决。

解决了！用新版本把高度拉长点。

authors: LoveLoliii MistEO

repo: kokolokksk/catcat-dm-react


text:
1.21.1 Support!

https://github.com/PrismarineJS/mineflayer/commit/3f1f0a3fef9aef3113d2de62d70e6e42410b0b44
With the new release 4.23.0, mineflayer dropped 1.21.1 support
In testing i found out that 1.21 doesn't work????? But 1.21.1 does

sorry I implemented it myself #255

repo: kolbytn/mindcraft


text:
Improve attribute parsing from monsters.txt

I rationalized how we parse attributes from monsters.txt. Rather than having 36 different attributes and calling a MonsterData constructor with 28 parameters, parse the parameters into 1 data structure and call a constructor with 4 parameters.

The constructor still needs to extract all the attributes out and set the expected fields, but adding a new attribute now no longer requires adding a parameter to the constructor: add parsing in MonsterData, add a field to the MonsterData class and set it in the constructor, and, as before, use that field as needed. Perhaps a field in the Monster Proxy Record. And so on.

I normalized the order of the fields in monsters.txt: Atk, Def, HP, Init, ... or something.
I added Article, Group, Elemental Resistance as attribute, complete with Monster Proxy Record field.
I normalize string you get from the Monster.attributes proxy record field
I added "test fix-monster-attributes" to read monsters.txt line by line and replace the attributes (field 4) with the normalized version.
I ran it on monsters.txt and found 998 (!) monsters that needed to be updated. This is included.
I made Phys: and Elem: allow Expressions, rather than just ints
I wrote a test suite for the string -> attribute map and attribute map -> string methods.
I wrote a test showing that the MonsterData constructor parses an attribute string.

Coming in a follow-up PR:

Improve MonsterManuelManager to extract "Article" and include it in the "attributes" string it generates for new monsters.
Provide MonsterManuelManager with a utility to visit every page and extract the Articles for every monster, saving them in a map from monster ID to Attribute map
Given that, it will be trivial to make "test fix-monster-articles" to add that field to every monster in Manuel.

Ready for review. I am deferring importing "article" from MonsterManuelManager until the next PR.

Checking monsters.txt for lines of differing length (then removing those where Poison was added) gives:
263 full-length mirror	1553	bigmirror.gif	NOCOPY LUCKY Scale: 0 Cap: ? Init: 50 P: construct
263 full-length mirror	1553	bigmirror.gif	NOCOPY LUCKY Scale: 0 Cap: 10000 Init: 50 P: construct
292 Gnollish Crossdresser	19	dk_cross.gif	Atk: 11 Def: 9 HP: 5 Init: 60 E: sleaze EA: sleaze Meat: 22 P: humanoid	gnoll teeth (5)	frilly skirt (25)	maiden wig (25)	frilly shirt (c5)	Gnollish Crossdress (c0)
292 Gnollish Crossdresser	19	dk_cross.gif	Atk: 11 Def: 9 HP: 5 Init: 60 Meat: 22 P: humanoid E: sleaze	gnoll teeth (5)	frilly skirt (25)	maiden wig (25)	frilly shirt (c5)	Gnollish Crossdress (c0)
378 Knott Slanding	617	slanding.gif	NOCOPY ULTRARARE NOMANUEL Atk: 150 Def: 135 HP: 150 Init: 10000 E: cold Meat: 970-1342 P: beast	Dallas Dynasty Falcon Crest shield (100)
378 Knott Slanding	617	slanding.gif	NOCOPY NOMANUEL ULTRARARE Atk: 150 Def: 135 HP: 150 Init: 10000 Meat: 1156 P: beast E: cold	Dallas Dynasty Falcon Crest shield (100)
388 lihc	32	lich.gif	Atk: 20 Def: 18 HP: 11 Init: 60 ED: spooky EA: spooky EA: sleaze Meat: 36 P: undead	lihc eye (30)
388 lihc	32	lich.gif	Atk: 20 Def: 18 HP: 11 Init: 60 Meat: 36 P: undead E: sleaze	lihc eye (30)
570 scary pirate	307	zompirate.gif	Atk: 150 Def: 135 HP: 200 Init: 10000 E: spooky Meat: 45 P: pirate Wiki: "scary pirate (cursed)" 	cursed breeches (n0)	cursed cutlass (n0)	cursed eyepatch (n0)	folder (skull and crossbones) (c0)
570 scary pirate	307	zompirate.gif	Atk: 150 Def: 135 HP: 200 Init: 10000 Meat: 45 P: pirate E: spooky Wiki: "scary pirate (cursed)"	cursed breeches (n0)	cursed cutlass (n0)	cursed eyepatch (n0)	folder (skull and crossbones) (c0)
638 Stephen Spookyraven	1565	steven.gif	NOCOPY Scale: 5 Cap: 300 Init: 100 Meat: 500  P: undead	Stephen's secret formula (100)	Stephen's lab coat (100)
638 Stephen Spookyraven	1565	steven.gif	NOCOPY Scale: 5 Cap: 300 Init: 100 Meat: 500 P: undead	Stephen's secret formula (100)	Stephen's lab coat (100)
681 The Thing in the Basement	2164	drippything1.gif	NOMANUEL Atk: [300] Def: [300] HP: [320] Init: -10000 P: horror DRIPPY 	The Eye of the Thing in the Basement (n100)	The Fingernail of the Thing in the Basement (n100)
681 The Thing in the Basement	2164	drippything1.gif	NOMANUEL Atk: [300] Def: [300] HP: [320] Init: -10000 P: horror DRIPPY	The Eye of the Thing in the Basement (n100)	The Fingernail of the Thing in the Basement (n100)
1240 furious cow	1926	awolcow1.gif	WANDERER Scale: 0 Cap: ? Floor: ? Init: -10000 P: demon
1240 furious cow	1926	awolcow1.gif	WANDERER Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: demon
1241 furious giant cow	1929	awolcow2.gif	WANDERER Scale: 20 Cap: ? Floor: ? Init: -10000 P: demon
1241 furious giant cow	1929	awolcow2.gif	WANDERER Scale: 20 Cap: 10000 Floor: 10 Init: -10000 P: demon
1242 ungulith	1932	awolcow3.gif	WANDERER Scale: 40 Cap: ? Floor: ? Init: -10000 P: demon
1242 ungulith	1932	awolcow3.gif	WANDERER Scale: 40 Cap: 10000 Floor: 10 Init: -10000 P: demon
1244 emaciated rodeo clown	1927	awolclown1.gif	WANDERER Scale: 0 Cap: ? Floor: ? Init: -10000 P: horror
1244 emaciated rodeo clown	1927	awolclown1.gif	WANDERER Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: horror
1245 menacing rodeo clown	1930	awolclown2.gif	WANDERER Scale: 20 Cap: ? Floor: ? Init: -10000 P: horror
1245 menacing rodeo clown	1930	awolclown2.gif	WANDERER Scale: 20 Cap: 10000 Floor: 10 Init: -10000 P: horror
1246 grizzled rodeo clown	1933	awolclown3.gif	WANDERER Scale: 40 Cap: ? Floor: ? Init: -10000 P: horror
1246 grizzled rodeo clown	1933	awolclown3.gif	WANDERER Scale: 40 Cap: 10000 Floor: 10 Init: -10000 P: horror
1248 aggressive grass snake	1928	awolsnake1.gif	WANDERER Scale: 0 Cap: ? Floor: ? Init: -10000 P: beast SNAKE
1248 aggressive grass snake	1928	awolsnake1.gif	WANDERER Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: beast SNAKE
1249 prince snake	1931	awolsnake2.gif	WANDERER Scale: 20 Cap: ? Floor: ? Init: -10000 E: sleaze P: beast SNAKE	snake oil (100)	snake oil (100)
1249 prince snake	1931	awolsnake2.gif	WANDERER Scale: 20 Cap: 10000 Floor: 10 Init: -10000 P: beast SNAKE E: sleaze	snake oil (100)	snake oil (100)
1250 king snake	1934	awolsnake3.gif	WANDERER Scale: 40 Cap: ? Floor: ? Init: -10000 P: beast SNAKE	snake oil (100)	snake oil (100)	snake oil (100)
1250 king snake	1934	awolsnake3.gif	WANDERER Scale: 40 Cap: 10000 Floor: 10 Init: -10000 P: beast SNAKE	snake oil (100)	snake oil (100)	snake oil (100)
1258 Villainous Minion	2024	bond_minion1.gif,bond_minion2.gif,bond_minion3.gif,bond_minion4.gif	Scale: -2 Cap: ? Floor: ? Init: 50 P: dude
1258 Villainous Minion	2024	bond_minion1.gif,bond_minion2.gif,bond_minion3.gif,bond_minion4.gif	Scale: -2 Cap: 10000 Floor: 10 Init: 50 P: dude
1259 Villainous Henchperson	2025	bond_sidekick1.gif,bond_sidekick2.gif,bond_sidekick3.gif,bond_sidekick4.gif,bond_sidekick5.gif,bond_sidekick6.gif,bond_sidekick7.gif,bond_sidekick8.gif,bond_sidekick9.gif	NOCOPY Scale: 10 Cap: ? Floor: ? Init: -10000 P: dude
1259 Villainous Henchperson	2025	bond_sidekick1.gif,bond_sidekick2.gif,bond_sidekick3.gif,bond_sidekick4.gif,bond_sidekick5.gif,bond_sidekick6.gif,bond_sidekick7.gif,bond_sidekick8.gif,bond_sidekick9.gif	NOCOPY Scale: 10 Cap: 10000 Floor: 10 Init: -10000 P: dude
1260 Villainous Villain	2026	bond_villain1.gif,bond_villain2.gif,bond_villain3.gif,bond_villain4.gif,bond_villain5.gif,bond_villain6.gif,bond_villain7.gif	NOCOPY Scale: 11 Cap: ? Floor: ? Init: -10000 P: dude
1260 Villainous Villain	2026	bond_villain1.gif,bond_villain2.gif,bond_villain3.gif,bond_villain4.gif,bond_villain5.gif,bond_villain6.gif,bond_villain7.gif	NOCOPY Scale: 11 Cap: 10000 Floor: 10 Init: -10000 P: dude
1288 invader bullet	2137	invaderbullet.gif	WANDERER Scale: 20 Cap: ? Floor: ? Init: 10000 P: construct
1288 invader bullet	2137	invaderbullet.gif	WANDERER Scale: 20 Cap: 10000 Floor: 10 Init: 10000 P: construct
1515 Black Crayon Beast	1187	cray_beast.gif	FREE Scale: 0 Cap: ? Init: -10000 P: beast	crayon shavings (100)
1515 Black Crayon Beast	1187	cray_beast.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: beast	crayon shavings (100)
1516 Black Crayon Beetle	1191	cray_bug.gif	FREE Scale: 0 Cap: ? Init: -10000 P: bug	crayon shavings (100)
1516 Black Crayon Beetle	1191	cray_bug.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: bug	crayon shavings (100)
1517 Black Crayon Constellation	1206	cray_const.gif	FREE Scale: 0 Cap: ? Init: -10000 P: constellation	crayon shavings (100)
1517 Black Crayon Constellation	1206	cray_const.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: constellation	crayon shavings (100)
1518 Black Crayon Crimbo Elf	1201	cray_elf.gif	FREE Scale: 0 Cap: ? Init: -10000 P: elf	crayon shavings (100)
1518 Black Crayon Crimbo Elf	1201	cray_elf.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: elf	crayon shavings (100)
1519 Black Crayon Demon	1194	cray_demon.gif	FREE Scale: 0 Cap: ? Init: -10000 P: demon	crayon shavings (100)
1519 Black Crayon Demon	1194	cray_demon.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: demon	crayon shavings (100)
1520 Black Crayon Elemental	1205	cray_elemental.gif	FREE Scale: 0 Cap: ? Init: -10000 P: elemental	crayon shavings (100)
1520 Black Crayon Elemental	1205	cray_elemental.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: elemental	crayon shavings (100)
1521 Black Crayon Fish	1196	cray_fish.gif	FREE Scale: 0 Cap: ? Init: -10000 P: fish	crayon shavings (100)
1521 Black Crayon Fish	1196	cray_fish.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: fish	crayon shavings (100)
1522 Black Crayon Flower	1199	cray_plant.gif	FREE Scale: 0 Cap: ? Init: -10000 P: plant	crayon shavings (100)
1522 Black Crayon Flower	1199	cray_plant.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: plant	crayon shavings (100)
1523 Black Crayon Frat Orc	1193	cray_orc.gif	FREE Scale: 0 Cap: ? Init: -10000 P: orc	crayon shavings (100)
1523 Black Crayon Frat Orc	1193	cray_orc.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: orc	crayon shavings (100)
1524 Black Crayon Goblin	1197	cray_goblin.gif	FREE Scale: 0 Cap: ? Init: -10000 P: goblin	crayon shavings (100)
1524 Black Crayon Goblin	1197	cray_goblin.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: goblin	crayon shavings (100)
1525 Black Crayon Golem	1188	cray_construct.gif	FREE Scale: 0 Cap: ? Init: -10000 P: construct	crayon shavings (100)
1525 Black Crayon Golem	1188	cray_construct.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: construct	crayon shavings (100)
1526 Black Crayon Hippy	1192	cray_hippy.gif	FREE Scale: 0 Cap: ? Init: -10000 P: hippy	crayon shavings (100)
1526 Black Crayon Hippy	1192	cray_hippy.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: hippy	crayon shavings (100)
1527 Black Crayon Hobo	1207	cray_hobo.gif	FREE Scale: 0 Cap: ? Init: -10000 P: hobo	crayon shavings (100)
1527 Black Crayon Hobo	1207	cray_hobo.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: hobo	crayon shavings (100)
1528 Black Crayon Man	1186	cray_dude.gif	FREE Scale: 0 Cap: ? Init: -10000 P: dude	crayon shavings (100)
1528 Black Crayon Man	1186	cray_dude.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: dude	crayon shavings (100)
1529 Black Crayon Manloid	1190	cray_humanoid.gif	FREE Scale: 0 Cap: ? Init: -10000 P: humanoid	crayon shavings (100)
1529 Black Crayon Manloid	1190	cray_humanoid.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: humanoid	crayon shavings (100)
1530 Black Crayon Mer-kin	1202	cray_merkin.gif	FREE Scale: 0 Cap: ? Init: -10000 P: mer-kin	crayon shavings (100)
1530 Black Crayon Mer-kin	1202	cray_merkin.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: mer-kin	crayon shavings (100)
1531 Black Crayon Penguin	1204	cray_penguin.gif	FREE Scale: 0 Cap: ? Init: -10000 P: penguin	crayon shavings (100)
1531 Black Crayon Penguin	1204	cray_penguin.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: penguin	crayon shavings (100)
1532 Black Crayon Pirate	1198	cray_pirate.gif	FREE Scale: 0 Cap: ? Init: -10000 P: pirate	crayon shavings (100)
1532 Black Crayon Pirate	1198	cray_pirate.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: pirate	crayon shavings (100)
1533 Black Crayon Shambling Monstrosity	1195	cray_horror.gif	FREE Scale: 0 Cap: ? Init: -10000 P: horror	crayon shavings (100)
1533 Black Crayon Shambling Monstrosity	1195	cray_horror.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: horror	crayon shavings (100)
1534 Black Crayon Slime	1203	cray_slime.gif	FREE Scale: 0 Cap: ? Init: -10000 P: slime	crayon shavings (100)
1534 Black Crayon Slime	1203	cray_slime.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: slime	crayon shavings (100)
1535 Black Crayon Spiraling Shape	1200	cray_weird.gif	FREE Scale: 0 Cap: ? Init: -10000 P: weird	crayon shavings (100)
1535 Black Crayon Spiraling Shape	1200	cray_weird.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: weird	crayon shavings (100)
1536 Black Crayon Undead Thing	1189	cray_undead.gif	FREE Scale: 0 Cap: ? Init: -10000 P: undead	crayon shavings (100)
1536 Black Crayon Undead Thing	1189	cray_undead.gif	FREE Scale: 0 Cap: 10000 Init: -10000 P: undead	crayon shavings (100)
1622 gummi plesiosaur	1491	plesio.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: beast	small gummi fin (0)	gummi sword (0)
1622 gummi plesiosaur	1491	plesio.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: beast	small gummi fin (0)	gummi sword (0)
1623 lemonhead minnow	1492	lemonfish.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: fish	lemonhead caviar (0)	lemony scales (0)	lemony scales (0)
1623 lemonhead minnow	1492	lemonfish.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: fish	lemonhead caviar (0)	lemony scales (0)	lemony scales (0)
1624 school of gummi piranhas	1490	gummifish.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: fish	gummi fang (0)	chocolate cow bone (0)
1624 school of gummi piranhas	1490	gummifish.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: fish	gummi fang (0)	chocolate cow bone (0)
1625 chocolate hare	1494	chocohare.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: beast	chocolate rabbit's foot (0)	candy carrot (0)
1625 chocolate hare	1494	chocohare.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: beast	chocolate rabbit's foot (0)	candy carrot (0)
1626 chocolate-cherry prairie dog	1495	ccprairie.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: beast	candy mountain oyster (0)	chocolate-stained collar (0)
1626 chocolate-cherry prairie dog	1495	ccprairie.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: beast	candy mountain oyster (0)	chocolate-stained collar (0)
1627 Rock Pop weasel	1493	popweasel.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: beast	mulberry (0)	weasel stomping pants (0)
1627 Rock Pop weasel	1493	popweasel.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: beast	mulberry (0)	weasel stomping pants (0)
1628 candied pecan tree	1496	pecantree.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: plant	candied pecan (0)	candy stick (0)
1628 candied pecan tree	1496	pecantree.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: plant	candied pecan (0)	candy stick (0)
1629 licorice snake	1497	licosnake.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: beast SNAKE	anise-flavored venom (0)	licorice whip (0)
1629 licorice snake	1497	licosnake.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: beast SNAKE	anise-flavored venom (0)	licorice whip (0)
1630 tricksy pixie	1498	trixiepixie.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: humanoid	sour powder (0)	pixie axie (0)
1630 tricksy pixie	1498	trixiepixie.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: humanoid	sour powder (0)	pixie axie (0)
1631 fire truck	1499	firetruck.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: construct	fireman's lunch (0)	fire hose (0)
1631 fire truck	1499	firetruck.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: construct	fireman's lunch (0)	fire hose (0)
1632 ice cream truck	1500	icecreamtruck.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: construct	ice cream sandwich (0)	plain paper hat (0)
1632 ice cream truck	1500	icecreamtruck.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: construct	ice cream sandwich (0)	plain paper hat (0)
1633 monster hearse	1502	monsterhearse.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: construct	nachos of the night (0)	skull gearshift knob (0)
1633 monster hearse	1502	monsterhearse.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: construct	nachos of the night (0)	skull gearshift knob (0)
1634 sewer tanker	1501	sewertruck.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: construct	plumber's lunch (0)	"honey" dipper (0)
1634 sewer tanker	1501	sewertruck.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: construct	plumber's lunch (0)	"honey" dipper (0)
1635 sketchy van	1503	sketchyvan.gif	NOCOPY Scale: ? Cap: ? Floor: ? Init: -10000 P: construct	can of Adultwitch™ (0)	Sketcherz™ (0)
1635 sketchy van	1503	sketchyvan.gif	NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: construct	can of Adultwitch™ (0)	Sketcherz™ (0)
1913 Ancient Skeleton with Skin still on it	1962	skinskeleton.gif	Scale: 3 Cap: ? Floor: 20 Init: -10000 P: undead	compounded experience (c100)	time residue (c0)
1913 Ancient Skeleton with Skin still on it	1962	skinskeleton.gif	Scale: 3 Cap: 10000 Floor: 20 Init: -10000 P: undead	compounded experience (c100)	time residue (c0)
1914 Apathetic Tyrannosaurus	1959	apatheticdino.gif	Scale: 3 Cap: ? Floor: 20 Init: -10000 P: beast	compounded experience (c100)	time residue (c0)
1914 Apathetic Tyrannosaurus	1959	apatheticdino.gif	Scale: 3 Cap: 10000 Floor: 20 Init: -10000 P: beast	compounded experience (c100)	time residue (c0)
1915 Assembly Elemental	1960	assemblyelem.gif	Scale: 5 Cap: ? Floor: 20 Init: -10000 P: elemental	compounded experience (c100)	time residue (c0)
1915 Assembly Elemental	1960	assemblyelem.gif	Scale: 5 Cap: 10000 Floor: 20 Init: -10000 P: elemental	compounded experience (c100)	time residue (c0)
1916 Cro-Magnon Gnoll	1961	cromaggnoll.gif	Scale: 7 Cap: ? Floor: 20 Init: -10000 P: humanoid	compounded experience (c100)	time residue (c0)
1916 Cro-Magnon Gnoll	1961	cromaggnoll.gif	Scale: 7 Cap: 10000 Floor: 20 Init: -10000 P: humanoid	compounded experience (c100)	time residue (c0)
1917 Krakrox the Barbarian	1964	krakrox.gif	Scale: 25 Cap: ? Floor: 40 Init: -10000 P: dude	compounded experience (c100)	time residue (c100)	time residue (c100)	time residue (c100)
1917 Krakrox the Barbarian	1964	krakrox.gif	Scale: 25 Cap: 10000 Floor: 40 Init: -10000 P: dude	compounded experience (c100)	time residue (c100)	time residue (c100)	time residue (c100)
1919 Wooly Duck	1963	woolyduck.gif	Scale: 5 Cap: ? Floor: 20 Init: -10000 P: beast	compounded experience (c100)	time residue (c0)
1919 Wooly Duck	1963	woolyduck.gif	Scale: 5 Cap: 10000 Floor: 20 Init: -10000 P: beast	compounded experience (c100)	time residue (c0)
1939 GNG-3-R	1992	gng3r.gif	NOCOPY BOSS Scale: ? Cap: ? Floor: ? Init: 300 P: construct	industrial frosting (n100)
1939 GNG-3-R	1992	gng3r.gif	BOSS NOCOPY Scale: 0 Cap: 10000 Floor: 10 Init: 300 P: construct	industrial frosting (n100)
1942 LOV Enforcer	2009	lovenforcer.gif	NOCOPY Scale: 5 Cap: ? Floor: ? Init: -10000 P: dude Phys: 75	LOV Elixir #3 (c0)
1942 LOV Enforcer	2009	lovenforcer.gif	NOCOPY Scale: 5 Cap: 10000 Floor: 10 Init: -10000 P: dude Phys: 75	LOV Elixir #3 (c0)
1943 LOV Engineer	2010	lovengineer.gif	NOCOPY Scale: 5 Cap: ? Floor: ? Init: -10000 P: dude Phys: 25	LOV Elixir #6 (c0)
1943 LOV Engineer	2010	lovengineer.gif	NOCOPY Scale: 5 Cap: 10000 Floor: 10 Init: -10000 P: dude Phys: 25	LOV Elixir #6 (c0)
1944 LOV Equivocator	2011	lovequivocator.gif	NOCOPY Scale: 5 Cap: ? Floor: ? Init: 500 P: dude Phys: 50	LOV Elixir #9 (p0)
1944 LOV Equivocator	2011	lovequivocator.gif	NOCOPY Scale: 5 Cap: 10000 Floor: 10 Init: 500 P: dude Phys: 50	LOV Elixir #9 (p0)
1947 hostile plant	2013	sgplanta1.gif,sgplanta2.gif,sgplanta3.gif,sgplanta4.gif,sgplanta5.gif,sgplanta6.gif,sgplanta7.gif,sgplanta8.gif,sgplanta9.gif,sgplanta10.gif,sgplanta11.gif,sgplanta12.gif,sgplanta13.gif,sgplanta14.gif,sgplanta15.gif,sgplanta16.gif,sgplanta17.gif,sgplanta18.gif,sgplanta19.gif,sgplanta20.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: plant	edible alien plant bit	alien plant fibers	alien plant goo
1947 hostile plant	2013	sgplanta1.gif,sgplanta2.gif,sgplanta3.gif,sgplanta4.gif,sgplanta5.gif,sgplanta6.gif,sgplanta7.gif,sgplanta8.gif,sgplanta9.gif,sgplanta10.gif,sgplanta11.gif,sgplanta12.gif,sgplanta13.gif,sgplanta14.gif,sgplanta15.gif,sgplanta16.gif,sgplanta17.gif,sgplanta18.gif,sgplanta19.gif,sgplanta20.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: plant	edible alien plant bit	alien plant fibers	alien plant goo
1948 large hostile plant	2014	sgplantb1.gif,sgplantb2.gif,sgplantb3.gif,sgplantb4.gif,sgplantb5.gif,sgplantb6.gif,sgplantb7.gif,sgplantb8.gif,sgplantb9.gif,sgplantb10.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] Init: -10000 P: plant	edible alien plant bit	edible alien plant bit	alien plant fibers	alien plant fibers	alien plant goo
1948 large hostile plant	2014	sgplantb1.gif,sgplantb2.gif,sgplantb3.gif,sgplantb4.gif,sgplantb5.gif,sgplantb6.gif,sgplantb7.gif,sgplantb8.gif,sgplantb9.gif,sgplantb10.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: -10000 P: plant	edible alien plant bit	edible alien plant bit	alien plant fibers	alien plant fibers	alien plant goo
1949 exotic hostile plant	2015	sgplantc1.gif,sgplantc2.gif,sgplantc3.gif	Scale: [10+25*pref(_spacegatePlanetIndex)] NOCOPY Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: plant	edible alien plant bit	edible alien plant bit	edible alien plant bit	alien plant fibers	alien plant fibers	alien plant fibers	alien plant goo	alien plant pod
1949 exotic hostile plant	2015	sgplantc1.gif,sgplantc2.gif,sgplantc3.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: plant	edible alien plant bit	edible alien plant bit	edible alien plant bit	alien plant fibers	alien plant fibers	alien plant fibers	alien plant goo	alien plant pod
1950 small hostile animal	2016	sganimala1.gif,sganimala2.gif,sganimala3.gif,sganimala4.gif,sganimala5.gif,sganimala6.gif,sganimala7.gif,sganimala8.gif,sganimala9.gif,sganimala10.gif,sganimala11.gif,sganimala12.gif,sganimala13.gif,sganimala14.gif,sganimala15.gif,sganimala16.gif,sganimala17.gif,sganimala18.gif,sganimala19.gif,sganimala20.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: beast	alien meat	alien toenails	alien animal goo
1950 small hostile animal	2016	sganimala1.gif,sganimala2.gif,sganimala3.gif,sganimala4.gif,sganimala5.gif,sganimala6.gif,sganimala7.gif,sganimala8.gif,sganimala9.gif,sganimala10.gif,sganimala11.gif,sganimala12.gif,sganimala13.gif,sganimala14.gif,sganimala15.gif,sganimala16.gif,sganimala17.gif,sganimala18.gif,sganimala19.gif,sganimala20.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: beast	alien meat	alien toenails	alien animal goo
1951 large hostile animal	2017	sganimalb1.gif,sganimalb2.gif,sganimalb3.gif,sganimalb4.gif,sganimalb5.gif,sganimalb6.gif,sganimalb7.gif,sganimalb8.gif,sganimalb9.gif,sganimalb10.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: beast	alien meat	alien meat	alien toenails	alien toenails	alien animal goo
1951 large hostile animal	2017	sganimalb1.gif,sganimalb2.gif,sganimalb3.gif,sganimalb4.gif,sganimalb5.gif,sganimalb6.gif,sganimalb7.gif,sganimalb8.gif,sganimalb9.gif,sganimalb10.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: beast	alien meat	alien meat	alien toenails	alien toenails	alien animal goo
1952 exotic hostile animal	2018	sganimalc1.gif,sganimalc2.gif,sganimalc3.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: beast	alien meat	alien meat	alien meat	alien toenails	alien toenails	alien toenails	alien animal goo	alien animal milk
1952 exotic hostile animal	2018	sganimalc1.gif,sganimalc2.gif,sganimalc3.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: beast	alien meat	alien meat	alien meat	alien toenails	alien toenails	alien toenails	alien animal goo	alien animal milk
1953 Spant drone	2019	sgspantdrone.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: bug	spant chitin	spant chitin	spant tendon	spant tendon
1953 Spant drone	2019	sgspantdrone.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: bug	spant chitin	spant chitin	spant tendon	spant tendon
1954 Spant soldier	2020	sgspantwarrior.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: bug	spant chitin	spant chitin	spant tendon	spant tendon	spant spear
1954 Spant soldier	2020	sgspantwarrior.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: bug	spant chitin	spant chitin	spant tendon	spant tendon	spant spear
1955 Murderbot drone	2021	sgmbdrone.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: construct	murderbot component casing	murderbot monofilament	murderbot monofilament	murderbot power cell	murderbot power cell	murderbot memory chip
1955 Murderbot drone	2021	sgmbdrone.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: construct	murderbot component casing	murderbot monofilament	murderbot monofilament	murderbot power cell	murderbot power cell	murderbot memory chip
1956 Murderbot soldier	2022	sgmb.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: construct	murderbot component casing	murderbot component casing	murderbot monofilament	murderbot monofilament	murderbot power cell	murderbot power cell	murderbot memory chip	murderbot memory chip	murderbot memory chip	murderbot plasma rifle
1956 Murderbot soldier	2022	sgmb.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: construct	murderbot component casing	murderbot component casing	murderbot monofilament	murderbot monofilament	murderbot power cell	murderbot power cell	murderbot memory chip	murderbot memory chip	murderbot memory chip	murderbot plasma rifle
1957 hostile intelligent alien	2023	sgalienb1.gif,sgalienb2.gif,sgalienb3.gif,sgalienb4.gif,sgalienb5.gif,sgalienb6.gif,sgalienb7.gif,sgalienb8.gif,sgalienb9.gif,sgalienb10.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: ? Init: [60+10*pref(_spacegatePlanetIndex)] P: humanoid
1957 hostile intelligent alien	2023	sgalienb1.gif,sgalienb2.gif,sgalienb3.gif,sgalienb4.gif,sgalienb5.gif,sgalienb6.gif,sgalienb7.gif,sgalienb8.gif,sgalienb9.gif,sgalienb10.gif	NOCOPY Scale: [10+25*pref(_spacegatePlanetIndex)] Cap: 10000 Floor: 10 Init: [60+10*pref(_spacegatePlanetIndex)] P: humanoid
1998 God Lobster	2088	godlob.gif,godlob_scepter.gif,godlob_ring.gif,godlob_rod.gif,godlob_cape.gif,godlob_crown.gif	NOCOPY FREE Scale: [10*equipped(God Lobster's Scepter)+20*equipped(God Lobster's Ring)+30*equipped(God Lobster's Rod)+40*equipped(God Lobster's Robe)+50*equipped(God Lobster's Crown)] Cap: 1500 Floor: ? Init: 1000 P: horror
1998 God Lobster	2088	godlob.gif,godlob_scepter.gif,godlob_ring.gif,godlob_rod.gif,godlob_cape.gif,godlob_crown.gif	NOCOPY FREE Scale: [10*equipped(God Lobster's Scepter)+20*equipped(God Lobster's Ring)+30*equipped(God Lobster's Rod)+40*equipped(God Lobster's Robe)+50*equipped(God Lobster's Crown)] Cap: 1500 Floor: 10 Init: 1000 P: horror
2015 sausage goblin	2104	sausagegoblin.gif	FREE Scale: [1+2*pref(_sausageFights)] Cap: ? Floor: ? Init: -10000 Meat: 69 E: sleaze P: goblin	magical sausage casing (n100)	red-hot sausage fork (0)	bag of sausage links (n0)
2015 sausage goblin	2104	sausagegoblin.gif	FREE Scale: [1+2*pref(_sausageFights)] Cap: 10000 Floor: 10 Init: -10000 Meat: 69 P: goblin E: sleaze	magical sausage casing (n100)	red-hot sausage fork (0)	bag of sausage links (n0)
2051 holographic army	1629	holoarmy.gif	NOCOPY Scale: 30 Floor: ? Init: -10000 P: weird	holo-bomber (0)	holo-platoon (0)	holo-tank (0)
2051 holographic army	1629	holoarmy.gif	NOCOPY Scale: 30 Floor: 10 Init: -10000 P: weird	holo-bomber (0)	holo-platoon (0)	holo-tank (0)
2053 Xiblaxian political prisoner	1630	polprisoner.gif	NOCOPY Scale: 40 Floor: ? Init: -10000 P: weird	residual zeal (n100)	little red .epub file (c0)
2053 Xiblaxian political prisoner	1630	polprisoner.gif	NOCOPY Scale: 40 Floor: 10 Init: -10000 P: weird	residual zeal (n100)	little red .epub file (c0)
2109 Drunken Tropical Vacationer	1772	kok_drunk.gif	Scale: 0 Cap: ? Init: -10000 P: dude Meat: 200	Kokomo Resort Brand Suntan Oil (0)	Kokomo Resort Chip (0)	Kokomo Resort Chip (0)	Kokomo Resort Chip (0)	captured boozles (c0)
2109 Drunken Tropical Vacationer	1772	kok_drunk.gif	Scale: 0 Cap: 10000 Init: -10000 Meat: 200 P: dude	Kokomo Resort Brand Suntan Oil (0)	Kokomo Resort Chip (0)	Kokomo Resort Chip (0)	Kokomo Resort Chip (0)	captured boozles (c0)
2110 Lovestruck Tropical Honeymooners	1771	kok_lovers.gif	Scale: -5 Cap: ? Init: -10000 P: dude Meat: 250	Afternoon Delight (0)	Kokomo Resort Chip (0)	Kokomo Resort Chip (0)
2110 Lovestruck Tropical Honeymooners	1771	kok_lovers.gif	Scale: -5 Cap: 10000 Init: -10000 Meat: 250 P: dude	Afternoon Delight (0)	Kokomo Resort Chip (0)	Kokomo Resort Chip (0)
2111 Resort Waiter	1773	kok_waiter.gif	Scale: 5 Cap: ? Init: -10000 P: dude Meat: 100	Kokomo Resort Order Pad (0)	Kokomo Resort Chip (0)	Kokomo Resort Chip (0)	drinks tray (c0)
2111 Resort Waiter	1773	kok_waiter.gif	Scale: 5 Cap: 10000 Init: -10000 Meat: 100 P: dude	Kokomo Resort Order Pad (0)	Kokomo Resort Chip (0)	Kokomo Resort Chip (0)	drinks tray (c0)
2112 Brick Mulligan, the Bartender	1774	kok_tender.gif	NOCOPY Scale: 5 Cap: ? Floor: ? Init: -10000 P: dude	lemon (0)	lime (0)	orange (0)	bottle of gin (0)	bottle of vodka (0)	bottle of rum (0)	coconut shell (0)	little paper umbrella (0)	magical ice cubes (0)	eyebrow lifter (c0)
2112 Brick Mulligan, the Bartender	1774	kok_tender.gif	NOCOPY Scale: 5 Cap: 10000 Floor: 10 Init: -10000 P: dude	lemon (0)	lime (0)	orange (0)	bottle of gin (0)	bottle of vodka (0)	bottle of rum (0)	coconut shell (0)	little paper umbrella (0)	magical ice cubes (0)	eyebrow lifter (c0)
2334 mutant circuit-soldering elf	751	antlerelf.gif	Scale: 8 Floor: ? Init: 150 P: elf	elven moonshine (0)	miniature antlers (0)
2334 mutant circuit-soldering elf	751	antlerelf.gif	Scale: 8 Floor: 10 Init: 150 P: elf	elven moonshine (0)	miniature antlers (0)
2335 mutant cookie-baking elf	749	elfblob.gif	Scale: 6 Floor: ? Init: 75 P: elf	festive holiday hat (0)
2335 mutant cookie-baking elf	749	elfblob.gif	Scale: 6 Floor: 10 Init: 75 P: elf	festive holiday hat (0)
2336 mutant doll-dressing elf	748	elflimbs.gif	Scale: 6 Floor: ? Init: 75 P: elf	cheap elven gloves (0)
2336 mutant doll-dressing elf	748	elflimbs.gif	Scale: 6 Floor: 10 Init: 75 P: elf	cheap elven gloves (0)
2337 mutant gift-wrapping elf	747	elfclaw.gif	Scale: 6 Floor: ? Init: 75 P: elf	elven socks (0)
2337 mutant gift-wrapping elf	747	elfclaw.gif	Scale: 6 Floor: 10 Init: 75 P: elf	elven socks (0)
2338 mutant whistle-carving elf	750	elfhulk.gif	Scale: 7 Floor: ? Init: 100 P: elf	elven <i>limbos</i> gingerbread (0)	elven whittling knife (0)
2338 mutant whistle-carving elf	750	elfhulk.gif	Scale: 7 Floor: 10 Init: 100 P: elf	elven <i>limbos</i> gingerbread (0)	elven whittling knife (0)
2348 deadwood tree	864	shiv_dead.gif	Scale: 5 Cap: 200 Floor: ? Init: -10000 P: plant	petrified wood (5)	spooky bark (10)	spooky sap (5)
2348 deadwood tree	864	shiv_dead.gif	Scale: 5 Cap: 200 Floor: 10 Init: -10000 P: plant	petrified wood (5)	spooky bark (10)	spooky sap (5)
2349 fur tree	862	shiv_fur.gif	Scale: 5 Cap: 200 Floor: ? Init: -10000 P: plant	petrified wood (5)	spooky bark (10)	spooky sap (5)	wolfman mask (20)
2349 fur tree	862	shiv_fur.gif	Scale: 5 Cap: 200 Floor: 10 Init: -10000 P: plant	petrified wood (5)	spooky bark (10)	spooky sap (5)	wolfman mask (20)
2350 hangman's tree	865	shiv_hangman.gif	Scale: 5 Cap: 200 Floor: ? Init: -10000 P: plant	petrified wood (5)	spooky bark (10)	spooky sap (5)
2350 hangman's tree	865	shiv_hangman.gif	Scale: 5 Cap: 200 Floor: 10 Init: -10000 P: plant	petrified wood (5)	spooky bark (10)	spooky sap (5)
2351 pumpkin tree	863	shiv_pumpkin.gif	Scale: 5 Cap: 200 Floor: ? Init: -10000 P: plant	petrified wood (5)	pumpkinhead mask (20)	spooky bark (10)	spooky sap (5)
2351 pumpkin tree	863	shiv_pumpkin.gif	Scale: 5 Cap: 200 Floor: 10 Init: -10000 P: plant	petrified wood (5)	pumpkinhead mask (20)	spooky bark (10)	spooky sap (5)
2352 toilet-papered tree	861	shiv_tp.gif	Scale: 5 Cap: 200 Floor: ? Init: -10000 P: plant	mummy costume (20)	petrified wood (5)	spooky bark (10)	spooky sap (5)
2352 toilet-papered tree	861	shiv_tp.gif	Scale: 5 Cap: 200 Floor: 10 Init: -10000 P: plant	mummy costume (20)	petrified wood (5)	spooky bark (10)	spooky sap (5)
2358 bolt-cuttin' elf	900	elf_boltcutters.gif	Scale: ? Cap: ? Floor: ? Init: -10000 P: elf	elf resistance button (100)	handful of headless bolts (c100)	pair of bolt cutters (0)
2358 bolt-cuttin' elf	900	elf_boltcutters.gif	Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: elf	elf resistance button (100)	handful of headless bolts (c100)	pair of bolt cutters (0)
2359 monkey wrenchin' elf	894	elf_wrench.gif	Scale: ? Cap: ? Floor: ? Init: -10000 P: elf	elf resistance button (100)	throwing wrench (0)	wrench handle (c100)
2359 monkey wrenchin' elf	894	elf_wrench.gif	Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: elf	elf resistance button (100)	throwing wrench (0)	wrench handle (c100)
2360 propaganda-spewin' elf	901	elf_propaganda.gif	Scale: ? Cap: ? Floor: ? Init: -10000 P: elf	bottle of agitprop ink (c100)	elf resistance button (100)	poison pen (0)
2360 propaganda-spewin' elf	901	elf_propaganda.gif	Scale: 0 Cap: 10000 Floor: 10 Init: -10000 P: elf	bottle of agitprop ink (c100)	elf resistance button (100)	poison pen (0)
2423 Hammered Yam Golem	-57	drunkyam.gif	NOCOPY WANDERER NOMANUEL  Scale: -3 MLMult: 0	marshmallow flambé (c100)
2423 Hammered Yam Golem	-57	drunkyam.gif	NOCOPY NOMANUEL WANDERER Scale: -3 MLMult: 0	marshmallow flambé (c100)
2497 depressing French accordionist	1452	wanderacc1.gif	WANDERER Scale: -3 Floor: ? Init: -10000 P: dude	Bal-musette accordion (a0)
2497 depressing French accordionist	1452	wanderacc1.gif	WANDERER Scale: -3 Floor: 10 Init: -10000 P: dude	Bal-musette accordion (a0)
2498 lively Cajun accordionist	1453	wanderacc2.gif	WANDERER Scale: -3 Floor: ? Init: -10000 P: dude	Cajun accordion (a0)
2498 lively Cajun accordionist	1453	wanderacc2.gif	WANDERER Scale: -3 Floor: 10 Init: -10000 P: dude	Cajun accordion (a0)
2499 quirky indie-rock accordionist	1454	wanderacc3.gif	WANDERER Scale: -3 Floor: ? Init: -10000 P: dude	quirky accordion (a0)
2499 quirky indie-rock accordionist	1454	wanderacc3.gif	WANDERER Scale: -3 Floor: 10 Init: -10000 P: dude	quirky accordion (a0)
2518 Warbear Officer	1467	warbear21.gif,warbear22.gif,warbear23.gif	Scale: ? Cap: ? Floor: ? Init: 50 P: beast	warbear whosit (n100)	warbear whosit (n100)	warbear requisition box (f0)	warbear badge (f0)
2518 Warbear Officer	1467	warbear21.gif,warbear22.gif,warbear23.gif	Scale: 0 Cap: 10000 Floor: 10 Init: 50 P: beast	warbear whosit (n100)	warbear whosit (n100)	warbear requisition box (f0)	warbear badge (f0)
2519 High-Ranking Warbear Officer	1468	warbear31.gif,warbear32.gif,warbear33.gif	Scale: ? Cap: ? Floor: ? Init: 100 P: beast	warbear whosit (n100)	warbear whosit (n100)	warbear whosit (n100)	warbear officer requisition box (f0)
2519 High-Ranking Warbear Officer	1468	warbear31.gif,warbear32.gif,warbear33.gif	Scale: 0 Cap: 10000 Floor: 10 Init: 100 P: beast	warbear whosit (n100)	warbear whosit (n100)	warbear whosit (n100)	warbear officer requisition box (f0)
2552 imagining how your life would be better if you'd made different decisions	1995	badvibe3.gif	Scale: +3 Cap: 10000 Floor: 20 Init: -10000 P: weird	negative lump (0)	chakra sludge (0)
2552 imagining how your life would be better if you'd made different decisions	1995	badvibe3.gif	Scale: 3 Cap: 10000 Floor: 20 Init: -10000 P: weird	negative lump (0)	chakra sludge (0)

I note that:
Scale: ? Cap: ? Floor: ?

is replaced with
Scale: 0 Cap: 10000 Floor: 10

Not sure if deliberate or correct.
Gnollish Crossdresser had both an E: sleaze and an EA: sleaze. Probably an error.
Some spaces were collapsed -- good.

I note that:
Scale: ? Cap: ? Floor: ?

is replaced with
Scale: 0 Cap: 10000 Floor: 10

Not sure if deliberate or correct.

It is deliberate for the MonsterData to have an int for those -- and it intentionally uses the default if the value is "?" - unknown.
Yet another place where I should defer evaluation (and defaulting) of "?" to an int in the constructor.

Gnollish Crossdresser had both an E: sleaze and an EA: sleaze. Probably an error.

Yes. Its element is sleaze and it has a sleaze attack. It should just be E:

DataFileMechanicsTest just checks the number of delimited fields in a line, for various data files.  The previous iteration of monsters.txt was too complex for that.  Once this work is done we might consider whether the new version is simpler and thus a candidate for that test.  I'll monitor but this will help remind me or start a sidebar discussion about whether DataFileMechanicsTest has any utility as a test.

I stuck in some logging:
> test fix-monster-attributes

Monster: "Gnollish Crossdresser" has both EA: sleaze and sleaze
Monster: "Knott Slanding" has meat range 970-1342
Monster: "lihc" has both EA: spooky and sleaze
919 monster attributes changed

Looks like you found all the "weird" monsters. :)

I fixed Scale, Cap, and Floor to allow either an int, an expression, or ? - which means unknown so use default.
Those are all calculated at monster expression time. But the attribute has the original form.
I added a test for those three factors with "?".
I also reran the "fix" script on the original monsters.txt and included the fixed file.
Take another look, please?

DataFileMechanicsTest just checks the number of delimited fields in a line, for various data files. The previous iteration of monsters.txt was too complex for that. Once this work is done we might consider whether the new version is simpler and thus a candidate for that test. I'll monitor but this will help remind me or start a sidebar discussion about whether DataFileMechanicsTest has any utility as a test.

The new version is not "simpler" in that the number of delimited fields did not change; there are 4 required fields and then an arbitrary number of tab-separated item drops.
Now, if DataFileMechanicsTest wants to test the CONTENTS of the various fields, it could certainly validate whether the "attributes" field of this file are correct. Of course, running KoLmafia will do that for you. :)

I moved the duplicate attribute check up in front of the switch statement which handles them.
Monster: "lihc" has multiple values for the "EA:" attribute.
Monster: "large hostile plant" has multiple values for the "Init:" attribute.

This means that I can't be specific about the two values (since we haven't parsed them yet), but it would catch the error with the two Init: values.
If we add support for multiple EA:, this will have to change - just as the code for parsing EA: will have to change. :)
I fixed the large hostile plant to have the formula.

midgleyc requested changes on behalf of https://github.com/orgs/kolmafia/teams/staff 4 hours ago

large hostile plant had Init present twice (one formula, one number), and has been collapsed to one (number). This was probably a mistake in the initial data?
Other than the plant, this all seems sensible.

I fixed that, but I don't seem to have the option to "resolve" the request?

repo: kolmafia/kolmafia


text:
could you help me fix them?

@kolos26 The places I marked were connected at the top of the plane (yellow line), but there were still errors after I changed them, and I couldn't do it precisely because it was difficult to change it on the map. Thank you！

Hainan Airlines and Hong Kong Airlines belong to the same group, so their fuselages are the same

I will try to fix them :) sorry for not reacting for your messages, i had tones of homeworks

@kolos26 maybe i have a idea to fix. it if i can not fix,i will tell you.and under my promotion, about a thousand people play your livery plugin in chinese bilibili!

@kolos26 maybe i have a idea to fix. it if i can not fix,i will tell you.and under my promotion, about a thousand people play your livery plugin in chinese bilibili!

Wow thats cool, thanks a lot! One of the hardest things is to monitor non contributor users. Thank You For Supporting Us!
Btw this reminded me how huge China is...

@kolos26 maybe i have a idea to fix. it if i can not fix,i will tell you.and under my promotion, about a thousand people play your livery plugin in chinese bilibili!

Wow thats cool, thanks a lot! One of the hardest things is to monitor non contributor users. Thank You For Supporting Us! Btw this reminded me how huge China is...

please you fix them my idea is wrong:(


text:
SendTransaction request

Description
Closes #18
Type of change

[ ] New feature (non-breaking change which adds functionality)

Checklist

[ ] My code follows the style guidelines of this project
[ ] I have performed a self-review of my code
[ ] I have commented on my code, particularly in hard-to-understand areas
[ ] I have made corresponding changes to the documentation
[ ] My changes generate no new warnings
[ ] I have added tests that prove my fix is effective or that my feature works
[ ] New and existing unit tests pass locally with my changes

Pull Request Test Coverage Report for Build 6a728f28715d8899f38398a23266491a59653a37-PR-34

2 of 2 (100.0%)  changed or added relevant lines in 2 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 100.0%

Totals

Change from base Build ad932605898b88c4966fadf8167963d66e3ca2c5:
0%

Covered Lines:
133

Relevant Lines:
133

💛  - Coveralls

authors: Odraxs coveralls


text:
feat: add renovate customManager to update buildah image

STONEBLD-2661
buildah image is also specified in the .spec.stepTemplate.env. This custom manager updates the buildah image there.
Before you complete this pull request ...
Look for any open pull requests in the repository with the title "e2e-tests update" and
see if there are recent e2e-tests updates that will be applicable to your change.

Will adding this change here work?

Based on my current understanding of renovate, I don't think so. The packageRules defines how renovate handles a package (a dependency) detected by the tekton manager.
This custom manager is an addition to the tekton manager to cover the value fields.

repo: konflux-ci/build-definitions


text:
feat: Added csdiff package

csdiff package is installed in order to be used by SAST tasks to parse the results and generate fingerprinting.
This will be used by future SAST tasks provided by the OpenScanHub team, for example: https://issues.redhat.com/browse/OSH-737
@konflux-team , we created this as a draft PR in order to gather feedback from you. Would this be acceptable? Is something else needed? ...

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

Please upload report for BASE (main@09f6efc). Learn more about missing BASE report.

Additional details and impacted files
@@           Coverage Diff            @@
##             main      #292   +/-   ##
========================================
  Coverage        ?   100.00%
========================================
  Files           ?        18
  Lines           ?       498
  Branches        ?         0
========================================
  Hits            ?       498
  Misses          ?         0
  Partials        ?         0

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

@ralphbean Would you mind giving a review on this?

@ralphbean @14rcole @Josh-Everett Could any of you review it and approve it/comment it? Thank you!

/ok-to-test

@ralphbean Would you mind enabling the last CI test? I am not able to trigger it/merge this

@jperezdealgaba if you rebase your commit on the latest main, the Red Hat Konflux job issue should get resolved.

@dirgim I rebased the PR and GitHub is still showing that I need the approval from one maintainer for the workflow:

P.S.: I added the installation of the git packages to this PR as it will be also needed. I hope it is not a problem

All checks passed! I have no merge rights in this repo

authors: codecov-commenter dirgim jperezdealgaba ralphbean

repo: konflux-ci/konflux-test