API Improvement proposal

enum checklist to improve

[x] MaskType
[ ] AnimationType
[ ] GradientStartPoint
[ ] BorderSide
[ ] BlurEffectStyle
[ ] ColorType - FlatColorsTypeScript.swift
[ ] GradientType - GradientsTypeScript.swift
[ ] InteractiveGestureType
[ ] TransitionAnimationType
[ ] SystemTransitionType
[ ] TransitionFromDirection
[ ] TransitionHollowState
[ ] TransitionPageType

-------- Original Message --------
Hi All, I really love using this library. However i think that the API can be improved.
Presently a lot of properties are String because of InterfaceBuilder. Some property would be more usable, self-documented and less error-prone if they were enums with associated type.
Enums with associatedType are powerful and fit perfectly with IBAnimatable Purpose.
Before pursuing one example with maskType.using enums it will be possible to make this:

animatableView.maskType = MaskType.Parrallelogram(angle:45, direction: .Top)

animatableView.maskType = .Polygon(sides:8)
animatableView.maskType = .Circle

animatableView.maskType = “Polygon(8)“ // yes this is possible since the MaskType Enum adopts StringLiteralConvertible protocol

BUT (sadly) this will NOT be possible

let string = “Polygon(8);
animatableView.maskType = string // Since there is no StringConvertible protocol in swift (yet) , only String Lterals are convertible

I tried a lot of thing to be able to do this AND to stay compatible with Interface Builder But No way :(
The most convenient way IMO is to make 2 properties.

private var maskType : String
var eMaskType : MaskType

Since the string maskType is made for Interface Builder it can be private.
The advantage is that when accessing from code they will be just one way exposed.
and since MaskType is StringLiteralConvertible, the existant code that looks like :
view.maskType = “Circle”
will justNeed to be transformed to
view.eMaskType = “Circle”
And we could use @avalable(iOS, renamed=“eMaskType”) in order to simplify the migration
However, Since WWDC is soon, we can just wait to see Interface Builder improvements :)
I have already refactor maskType locally to an enum, for testing this. It works.
What do you think about it ?

@lastMove Thanks for your proposal, I like your ideas. We designed the APIs using String because the limitations and constraints of Xcode and Interface Builder. It should be fixed by Apple eventually (hopefully 😓).
We have discussed this issue before in #50, I also push back the code to wip/support-enum-for-non-ib-api branch for your reference, please notice, the code is very outdated comparing with the current master. We didn't work out a good solution and decide to use String like Polygon(8)
For your solution, I have few of concerns.
0. Does it work if we set maskType as private like private var maskType : String in Interface Builder?
0. Will all APIs call use maskType  has to move eMaskType? Breaking changes?

Hi,
I just read #50 a lot of good ideas, nice to read.
Yes private properties do work with InterfaceBuilder.
And yes it implies breaking changes. Either in InterfaceBuilder or in code API.
Since we can use @avalable(iOS, renamed=“eMaskType”)
i think it easier to put those breaking changes in Code API

@lastMove if we have to introduce breaking changes. I rather do it in code, not in Interface Builder, but need to think about it carefully. Also, we do that, and we may be able to change all similar APIs together, e.g. animationType,  maskType... Because it is better to have all breaking changes in one release. Let's hope if Apple fixes this issue in WWDC, and see any better option we have.

Since WWDC didn't bring any new stuffs, it would be nice to bring that API improvements with swift 3 support since it's already huge breaking changes. @lastMove improvements is a really nice move, that minimise a lot potential errors when using IBAnimatable programatically.

@tbaranes good call, how about we focus on API improvements for version 3. Since we need to support Swift 3 new API guidelines. We can include @lastMove 's suggestions within that as well.

To synthetize :

Naming : To stay compatible with Interface Builder we keep actual properties but they become private and new enums public properties.
This

  // MARK: - MaskDesignable
@IBInspectable public var maskType: String? {
    didSet {
      configMask()
      configBorder()
    }
  }

will become something like this :
  // MARK: - MaskDesignable
  @IBInspectable private var maskType: String? {
    didSet {
      eMaskType = MaskType(string:maskType);
    }
  }
  public var eMaskType: MaskType? {
    didSet {
      configMask()
      configBorder()
    }
  }

Add the new Enum for instance MaskType can looks like this ;
https://gist.github.com/lastMove/e155d8aabe4aca9a792b5486fb2d87cf

@lastMove thanks for your update, I like architecture very much 👍. And I have a few of questions about the implementation.

If we set maskType as private, will be any problem when the developer tries to subclass AnimatableView? I don't recommend subclassing from AnimatableView. Because if we want to have further customization for the UI elements, we should conform to protocols e.g. MaskDesignable directly to the custom UI element. That's how Protocol oriented programming works. But we can forbid someone from subclassing from AnimatableView. If someone does that, will it be a problem we set maskType as private?

Because IBAnimatble encourages the developer to use protocols to their own custom UI elements. We try to encapsulate as much as logic in Protocol Extension. And let the user use them concisely. We may be able to  put eMaskType = MaskType(string:maskType); within a Protocol Extension method.

Shall we always have failable init for MaskType, because the code in https://gist.github.com/lastMove/e155d8aabe4aca9a792b5486fb2d87cf#file-masktype-swift-L58 may crash the app.

Would you like to take the initiative for this change? We have discussed that before, Version 3 will focus on changing all APIs, it would be good to include this change in Version 3. If we all agree with that, we need to work on https://github.com/JakeLin/IBAnimatable/tree/swift3 branch for this change.

please let me know if you have any questions, thanks again.

1 - Good point, since Swift doesn’t supports protected properties we have to make them private.
From code it’s not annoying for subclasses since they still have access to eMaskType.
From Interface Builder I made some tests this may surprise you (I was very surprised) but privates properties of parent class still appear in IB.
Here is how i test it :
I made the maskType:String property private and subclass AnimatableView
public class AnimatableViewChild : AnimatableView {
  @IBInspectable public var aaaaa:String?
}

Very good news.
2 - Yes it would be great but  since we can’t declare private properties within protocol it can be complicated. Have you an idea for this ?
3 - Yes it better to make initialiser failable but in this case i was conforming to StringLiteralConvertible which require a non-failable. although I don’t know if it really useful to conform to StringLiteralConvertible.
4 - Yes i will be happy to help with this, starting from monday i will have more time.

@lastMove

what a surprise 😱  "privates properties of parent class still appear in IB"
No idea, need to be public in protocol
my opt out StringLiteralConvertible first? add back if needed.
Cool, thanks

@lastMove I have an idea for extension MaskType : StringLiteralConvertible, can we have an option for MaskType as .none, then if we can't convert the string to MaskType, we set it to .none. And we can guard it in configMask. How do you think?

Yeah, good idea !
Will do that.
Here is a list of "Enumable" properties :
That i found in IBAnimatable :
What to add to it.
Also It can be useful to create an IBEnum protocol.
there is one "bug" in swift 2 that avoid protocol extension for Enum
for instance it's not possible to do that :

public protocol IBStringConvertible  {
  init?(string:String)
}
public extension IBStringConvertible where Self: MaskType {
}

because : Type 'Self' constrained to non-protocol type 'MaskType'.
I have to try it with Xcode 8.

Here some more "enumable properties to complete the list:

AnimationType

GradientStartPoint

GradientType

SystemTransitionType

TransitionAnimationType

TransitionFromDirection

TransitionHollowState

TransitionPageType

Here some more "enumable" properties to complete the list:

Designable enums (fair enough for a first version of this new API I suppose):

AnimationType
GradientStartPoint

Enums generated from scripts (not sure if that change something):

ColorType
GradientType

Transitions animations:

SystemTransitionType
TransitionAnimationType
TransitionFromDirection
TransitionHollowState
TransitionPageType

I think that's all the enums we currently have in IBAnimatable.
Anyway, I'm following that thread from far, but I'm really excited to see the result, that's gonna be awesome 👍

For ColorType and GradientType, we can use #colorLiteral then we can preview the color in Xcode 8. It is very cool.

ty for this lit @tbaranes
I started working on this.

I tried two different implementations :
A simpler one
https://gist.github.com/lastMove/8cda639fe29a4db52ff03201890860d9
And one without literal strings
https://gist.github.com/lastMove/5be7046d40f6ac0b92d2373ccdb41c5f
I wanted to remove literal strings from the code but the only way i found add some implementations complications and ugliness ^^
What do you think about them ?
and for ColorType :
public extension ColorType
  var uicolor:UIColor {
    switch self {
    case .FlatEmerland:
      return #colorLiteral(red: 46 / 255, green:  204 / 255, blue:  113 / 255, alpha: 1.0)
    case .FlatPomegranate:
      return #colorLiteral(red: 192 / 255, green:  57 / 255, blue:  43 / 255, alpha: 1.0)
    case .FlatWetAsphalt:
      return #colorLiteral(red: 52 / 255, green:  73 / 255, blue:  94 / 255, alpha: 1.0)
    case .FlatTurquoise:
      return #colorLiteral(red: 26 / 255, green:  188 / 255, blue:  156 / 255, alpha: 1.0)
    case .FlatConcrete:
      return #colorLiteral(red: 149 / 255, green:  165 / 255, blue:  166 / 255, alpha: 1.0)
    case .FlatOrange:
      return #colorLiteral(red: 243 / 255, green:  156 / 255, blue:  18 / 255, alpha: 1.0)
 ...
}
}

By adding this computed property  these colors can be used from code.
I am trying to have a good "prototype" so don't hesitate to leave some comments even for details.

@lastMove I like the "Simpler implementation" version. https://gist.github.com/lastMove/8cda639fe29a4db52ff03201890860d9#file-masktype-swift-L62
The requirement is to add an extension method to Swift enum, but we can't. Then we create IBEnum to add extractNameAndParams extension method. I like this idea 👍
I also like your idea to put the conversion of ColorType inside the enum ColorType instead of predefinedColorFromString in FillDesignable.
Do you want to have access to push to the IBAnimatable repo? If so, you can push to some branches, and we can work together more efficiently. I think this will be a significant change, I can't think of every aspect upfront, we may need to keep improving it when we work on more enum types.  But your "prototype" is very good start with.

Nice,
Will we work on this in the swift3 branch or a new one.
Yes, It will simplify the process if i could push to this branch.

@lastMove I have added @tbaranes checklist to the top of your post. How about we work on them one by one and Pull Request to swfit3 branch? We can easily review them and discuss the changes. The order of the list doesn't matter. Some of the small enums we may be able to do them together in one PR. Once Xcode 8 GM releases, we can merge swift3 in master.

Thank you for this.
Yep, it's better to work on them in separated branches.
I will start with MaskType so.

@lastMove, thanks, please give me a buzz any time when you have any question, we can always push to a WIP branch for discussion.

I think we can remove x and y for AnimationType because we can use a better enum to support parameters. and use String MoveTo(50,150) for move to x:50 and y:150
Please let me know if you have any idea, thanks.

Yep it's improve coherence.
Could you delete the "wip/swift3-enum-masktype"
I have made a commit to "swift3-masktype"
Do you have some comments.
Ideally i would like to put eMaskType to a MaskDesignable protocol extension.
(it would prevents a lot of repetition code).
Since a protocol cannot contains stored properties the only way is to use objective C associated properties.
I don't know if it's a good idea.

@lastMove "wip/swift3-enum-masktype" has been deleted. You can delete any branch if you feel necessary, of cause, not master 😁, I will have a look at your commit and comment there, thanks.

@lastMove I have rebased swift3 branch to your branch "swift3-masktype" and made some changes based on my comment. We can test all masks in the demo app now, please have a look at #234.
Because I don't know whether do you have any changes to your branch, I pushed all changes to new branch feature/swift3-masktype
It is not completed yet. Please feel free to give me any feedback because we are still trying to have a good "prototype", thanks.

Ok perfect, Your changes are good for me since it reduces the number of checks required.
I will switch to your new branch, and test if everything works.

@lastMove great. Because the demo is an example for the users how to use the marks correctly, there are some edge cases not in the demo app. e.g. wrong data like Wave(0,10,45), or missing parameters like Wave(up,20). They should fall back to default parameters.
We can eailiy put the incorrect settings in IB and test them. There may be some edge cases I haven't thought, we may find out when we work on it more. Please let me know if you have any questions.

@JakeLin Ok. I just found a crash with the new implementation, when there is less than 3 parameters to wave Mask (again ^^).
I used to make a array extension to handle this :
internal extension CollectionType {
    /// Returns the element at the specified index iff it is within bounds, otherwise nil.
    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }
}
// Usage
let width = params[safe:2]

I would like to create a utils file where we can put this kind of code.
If developers include IBAnimatable directly by copy-pasting the IBAnimatable folder, it could conflicts with another implementation.
IMO it's it not a big problem.
@JakeLin @tbaranes what do you think ?

@lastMove I think it OK because we recommend the user use IBAnimatable using package management tools like CocoaPods, Carthage or SPM. Even the user copy-paste the folder, they still need to use params[safe:2] to use it, it won't pollute any existing APIs.

@lastMove I found out an issue. When we use private for maskType like @IBInspectable private var maskType: String?. But we can preview the design in Interface Builder. We can fix it by changing it to internal like @IBInspectable var maskType: String?.

Hum, annoying, good fix.
I applied your fix, and fix the crash too.
Now everything seems working.

There was also a crash when polygon sides < 2.
I made the minimum sides number to 3 to avoid this kind of problem.
let polygonPath = maskPolygonBezierPath(max(sides, 3))

@lastMove Good on you for finding edge cases. I have an idea to use using something like
  // MARK: - MaskDesignable
  public var maskType: MaskType = .none {
    didSet {
      configMask()
      configBorder()
    }
  }

  @IBInspectable var _maskType: String? {
    didSet {
      maskType = MaskType(string: _maskType)
    }
  }

I will push a commit and let you help me review it.

Actually I prefer this naming too.
But it breaks the retro-compatibility with existing storyboards.

@lastMove You're right, it will break the backward compatibility, we have to do some like adding a underscore _ in runtime attributes for _maskType.

But I am still tempted to change it. But I need you guys opinions.

Since _maskType is internal, the user can't see it if they use package management tools. And they still see Mask Type in Interface Builder as above. It makes like Interface Builder can support Swift enum.
Here is the commit for that change:  https://github.com/JakeLin/IBAnimatable/commit/bb2a86e418facfbc2cdaedfa262c61d329555ef6
@lastMove @tbaranes please let me know your ideas, thanks.

Hum, Interesting.
For me In absolute terms it's better to have _maskType:String and maskType:MaskType.
The only inconvenient is the Backward compatibility. But IMO we should do it, since more we wait more it will become difficult and hassling for users to have breaking changes.
We will have to write a migration guide. We could, maybe, write a shell-script that will automatically do the transition for current users (with a regex in all .storyboard files).

I'm really not a huge fan of interface builder breaking changes, but if it's necessary with a good documentation, it should be smooth enough. Moreover, if we have to break it, let's do it with swift 3 since it's already breaking everything!

Cool, let's change it. Interface Builder will display some warnings if we don't add the underscore. That can help the user notice the changes.
Also as you guys said we should have a migration guild with some detailed images to show how to change them manually. Or change them using an editor with "replace all" for the storyboard file. Or even provide a script to that that.
I'm so excited to improve IBAnimatble to a new degree.

Nice !
So we can consider MaskType (and so the prototype) OK ?

Yes, I think it is very good. Shall we PR it to swift3? May add some comment/documentation for it as well.

I added a little bit of documentation for MaskType.
Since I am not a native english speaker, there is certainly some typos. Feel free to fix it ;)

@lastMove Cool, I like it, I think we are ready to bring it back to swift3 now. Would you like to submit a PR or can I do it?

Hi all.
I started working on AnimationType. It's pretty straightforward.
Everything seems to work from code.
But when using it in storyboard it can be painful since it's case-sensitive.
for example "squeezein" will not work.
So I will try (I don't know how yet) to make it case-insensitive.

@lastMove thanks for picking up AnimationType. I think we should support case-insensitive, good idea 👍
I thought we could do it better by simplifying the enum with parameters. Because before we didn't find a good way to support Swift enum, we use slideInLeft, slideInRight and so on. But now we have a good way to support Swift enum with IBEnum.
Can we use something like case slideIn(from direction: AnimationDirection) to simplify  AnimationType. We did something similar in TransitionAnimationType already (need some change for Swift 3 though). The difference is we used fromDirection: in TransitionAnimationType but from direction: should be more Swift 3. Please let me know how do you think, also let me know if you need any help. Thanks again.

Oh Yes I see. Nice, It will simplify a lot the enum.
Maybe something like this :
public enum AnimationType {
  case slide(slideIn:Bool, direction:Direction)
  case squeeze(squeezeIn:Bool, direction:Direction)
  case fade(fadeIn:Bool, direction:Direction)
  case squeezeFade(squeezFadeIn:Bool, Direction:Direction)
  case zoom(zoomIn:Bool)
  case shake
  case pop
  case flip(axis:Axis)
  case morph
  case flash
  case wobble
  case swing
  case rotate(clockwise:Bool)
  case moveTo
  case moveBy
  case none

  public enum Axis {
    case x, y
  }
  public enum Direction {
    case left, right, up, down
  }
}

This model Seems better :
public enum AnimationType {
  case slide(way:Way, from:Direction)
  case squeeze(way:Way, from:Direction)
  case fade(way:Way, from:Direction)
  case squeezeFade(way:Way, from:Direction)
  case zoom(way:Way)
  case shake
  case pop
  case flip(along:Axis)
  case morph
  case flash
  case wobble
  case swing
  case rotate(clockwise:Bool)
  case moveTo
  case moveBy
  case none

  public enum Way {
    case Out, In
  }
  public enum Axis {
    case x, y
  }
  public enum Direction {
    case left, right, up, down
  }
}

I don't know how to  name the  Way enum, I don't really like "Way"

@lastMove I like the last one, it provides excellent readability for Interface Builder. e.g. slide(in,left), squeeze(out,up)
I have little concern for that when you use this enum in code, as you said the name of "Way" is one, I don't know how to make it better 😅. But the concept of Way is great 👍. And the second prameter from might not correct in some cases. e.g. let sideOutToRight = AnimationType(Way.out, from: Direction.Right), it is not from in that case. May just use case slide(way:Way, direction:Direction)?
Anohter one is we should be able to remove x, and y properties and put them as prameters of moveTo and moveBy. I don't like thoes two properties when I introduced them from day one. They are only used in two animation types moveTo and moveBy. Since we have better enum support, those properties can be remove now 😁

@JakeLin  @tbaranes I was thinking that reworking AnimationType would be as easy as conforming to IBEnum ... I was wrong ;)
Following JakeLin recommandations I ended up with something I like. (The counter part are the breaking changes ...).
AnimationType is now like that :
public enum AnimationType {
  case slide(way:Way?, direction:Direction?)
  case squeeze(way:Way?, direction:Direction?) // miss squeeze
  case fade(way:Way?, direction:Direction?) // miss fadeinout, fadeountin
  case squeezeFade(way:Way?, direction:Direction?)
  case zoom(way:Way?)
  case shake
  case pop
  case flip(along:Axis?)
  case morph
  case flash
  case wobble
  case swing
  case rotate(direction:RotationDirection?)
  case moveTo(x:Double?, y:Double?)
  case moveBy(x:Double?, y:Double?)
  case none

So I have [reworked Animatable.swift].(https://github.com/JakeLin/IBAnimatable/commit/26dc6516a673c1550df5780752f7eeee77c0cc93?diff=split)
Since it's a core part of IBAnimatable, it would be nice if you could both see and comment the code.
one notable point :
view.squeezeInUp() become view.animate(.squeeze(.in, .up)).
Also since Playground is not working on my side, I made a Animations section in the Demo App.
To access it :

Forgot password => Animations.
It's a picker where we can choose the animations to launch and see immediately the result.
There is 2 squares, one using the new system and the other, the old one..
We can see the result of both and compare ; the goal is to have exactly the same behavior.
There is still some differences but I wanted to show you both the code and results.
Let me know if the changes are Ok or can be improved or whatever ;)

Really nice work on the example! A good first step for #238.
About the commit, I really like the output. The code is easier to read, and more concise. Some general suggestion:

case .squeeze(let way, let direction): -> case let .squeeze(way, direction):`. I know we are not following a particular convention, but I really like this switch syntax. It makes easier to read the switch with just a quick look
Using enums are really useful, but can make the code harder to read if we abuse of switch. A nice way to handle this could be a mix between the old methods (animateInWithX, ...), and the new one. For example, when an animation has a direction, just create a generic function that returns a tuple with all the values calculable from a direction (distance, and scale)

Good first step on this @lastMove :+1:

Thank you for your feedback.
Strangely I didn't know about this syntax, it effectively better, thanks I will use it.
I am agree, there are some repetitive code in the implementation. Could you provide me an example of what you mean ?

I was thinking something like that:
A function which return the right values following a direction:
  func values(from direction: AnimationType.Direction, distance: (CGFloat, CGFloat), scale: (CGFloat, CGFloat) = (0, 0)) -> (CGFloat, CGFloat) {
    switch direction {
    case .left:
      return (-distance.0, scale.0)
    case .right:
      return (-distance.0, scale.0)
    case .down:
      return (-distance.1, scale.1)
    case .up:
      return (distance.1, scale.1)
    }
  }

Then the squeeze becomes:
  public func squeeze( way: AnimationType.Way, direction: AnimationType.Direction, completion: AnimatableCompletion? = nil) {
    let yDistance = screenSize.height * force
    let xDistance = screenSize.width * force
    let scale = 3 * force
    let values = values(from: direction, distance: (xDistance, yDistance), scale: (scale, scale))
    switch way {
    case .In:
      animateIn(values.0, values.1, values.2, values.3, 1, completion)
    case .Out where direction.isVertical():
      animateOut(values.0, values.1, values.2, values.3, 1, completion)
    case .Out:
      animateOut(values.0, values.1, values.2, values.3, 1, completion)
    }
  }

That's what I was thinking about. Using this will avoid to have 4-5 switch just to calculates a distance and scale from a direction. There probably a way to make it even better by improving the tuples usage with typealias, or whatever, maybe even creating two functions: one for the distance, one for the scale. Anyway, that's just the global idea, I didn't test it though, I'm not even sure that would work for every cases 😆

Very nice work @lastMove you have made a huge step to improve the demo app. And your API design makes the APIs much cleaner.
@tbaranes 's implementation is great too. One thing I hate about is the Animatable.swift file is toooooo big and I wanted to but didn't find a way to simplify it. You guys solution is making that happen.
I have a concern, should we make all parameters within the enum to non-optional? like
public enum AnimationType {
  case slide(way:Way, direction:Direction)
  case flip(along:Axis)
  case morph
  case rotate(direction:RotationDirection)
  case moveTo(x:Double, y:Double)
  case none

If the user uses the API and they should provide a value to the enum, if we provide a documentation comment, they will know about the default value and can apply that value. If we don't allow optional values as parameter, we don't need to apply default values in ***Designable, for example, we don't need to apply default values in configMask, and we can apply all default values in init(string: String?) of the enum. For example, in MaskType.init(string: String?), we can have something like
switch name.lowercased() {
    case "circle":
      self = .circle
    case "polygon":
      self = .polygon(sides: Int(params[safe:0] ?? "6"))
    case "star":
      self = .star(points: Int(params[safe:0] ?? "5"))
    case "triangle":
      self = .triangle
    case "wave":
      self = .wave(direction: WaveDirection(rawValue:(params[safe:0] ?? "up").lowercased()), width: Float(params[safe:1] ?? "40"), offset:Float(params[safe:2] ?? "0"))
    case "parallelogram":
      self = .parallelogram(angle: Double(params[safe:0] ?? "60"))
    default:
      self = .none
    }

Just try to encapsulate the logic inside the enum. How do you think @lastMove @tbaranes ?

I made a commit yesterday, in the spirit of what @tbaranes suggested
Also I introduced slideFade which is actually the equivalent of the old fade
The new fade is just for non-sliding fade animations (fade /in/out/inout/outin)
It's another breaking change but I found it clearer.
How do you think about it ?
It's ok for me to make enum parameters non-optional.
It will simplify the code.
one little detail about your sample. Since rawValue initialiser is failable
    case "wave":
self = .wave(direction: WaveDirection(rawValue:(params[safe:0] ?? "up").lowercased()), width: Float(params[safe:1] ?? "40"), offset:Float(params[safe:2] ?? "0"))

would become
    case "wave":
self = .wave(direction: WaveDirection(rawValue:(params[safe:0] ?? "").lowercased()) ?? .up, width: Float(params[safe:1] ?? "40"), offset:Float(params[safe:2] ?? "0"))

we could add an extension to have something like that
    case "wave":
self = .wave(direction: WaveDirection(rawValue: params[safe:0], default: .up).lowercased()), width: Float(params[safe:1] ?? "40"), offset:Float(params[safe:2] ?? "0") )

@lastMove thanks, I think we should use slideFade instead of fade because slideFade is more precise for the animations.
self = .wave(direction: WaveDirection(rawValue: params[safe:0], default: .up).lowercased()), width: Float(params[safe:1] ?? "40"), offset:Float(params[safe:2] ?? "0") ) is better 👍

Hi all,
I think we can remove BlurEffectStyle and just make UIBlurEffectStyle conforms to IBEnum. What do you think about it ?

@lastMove perfect idea ✌

Hi I have worked on BlurEffectStyle It seems working.
Since I am updating those enums I need to be able to easily test them.
So I could improve existing demo (playground part of the app) by the way.
What about having for BlurEffects a similar system than Animations one ?
(A picker view with 2 components, one for blurEffect and the second one for vibrancyEffect).
We could also apply this logic to Masks, to be able to change instantaneously the polygon sides number, or the star points etc.

That would be nice. It's easier to use, and give a quick result when testing IBAnimatable 👍

I like the idea, I like the animations demo very much. Well done 👍👍👍we have two ViewControllers in the demo app for testing blurEffect, please have a look , there is a layout issue for vibrancy effect view because we need to change the view hierarchy for that effect. I haven't found a way to fix it. Have created an issue for it.
Sent from my iPhone

On 28 Jul 2016, at 1:16 AM, Tom Baranes<EMAIL_ADDRESS>wrote:
That would be nice. It's easier to use, and give a quick result when testing IBAnimatable 👍
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

Hi guys,
I wasn't available these days. I will advance on this issue this WE :)

@lastMove no worries, I am working on adding release 2.7 to swift3 branch. There are so many conflicts 😔

Finally, well-done guys @lastMove @tbaranes  🎉 🎉 🎉


[5.1] Fixed the before send performed method

See #10607. I've also moved the creation of the event out of the for loop to stop us wasting time creating it over and over.

it would be nice to tag this asap !


non-empty body causes 'get' calls to fail

Any get call, including locate_services, sends a non-empty body, which SF's stock rest api responds to with a generic error.
When I instead send an empty body (i.e. "") with the same call, I get the successful response I expect.
The non-empty body is a result of this line's default body of ""
https://github.com/jeffweiss/forcex/blob/master/lib/forcex.ex#L37
being Poison.encode!'ed by this line:
https://github.com/jeffweiss/forcex/blob/master/lib/forcex.ex#L16
which results in a body of "\"\"".
I'm happy to put up a PR to fix it, but I'm curious if I'm missing something since I would expect this to cause problems for others.

Thanks for the report @craiglyons! I have changed employers and no longer have an SFDC. I’ll ask @mmrobins if he can validate.

@mmrobins Forcex.Client.login succeeds, it's the get in Forcex#services that fails.
It's an html error response indicating "We are down for maintenance." with a 411 code.
I presume they use 411 (content length required) since a body is present, but the header wouldn't be with a get.
Are you testing with a production instance? I'm testing against a sandbox account, which may have tighter restrictions.


Setting token after creating client

We are using consul in a singleton context in our IOC container.  I am trying to move to dynamic ACLs utilizing vault (Hashicorp's secret management tool).  In this case, we use a default Consul client to find our vault instance, get a dynamcially created ACL token from vault, and want to reset the consul client with the new token.  This is currently not possible.
I can help out with submitting a PR to support this but looking for feedback on how you would like to see it done (and if you think it is a good idea).  I could create a simple SetToken method but not sure if that would be the best way to go.

Hi, thanks for submitting this.
If possible I'd say the "best correct option" in my opinion would be to create a "bootstrap" ConsulClient during your IOC construction (I have no idea how you're doing this, though, and it's quite awkward in reality since a constructor can't be async) rather than using the global singleton and re-configuring the singleton after you've managed to obtain a token.
There was a reason I made the ConsulClient's configuration post-creation immutable a few versions ago: because there are so many moving parts in a multithreaded environment I've attempted to make the ConsulClient as immutable as possible so as to not add locks to common code paths through it. Additionally, I can guarantee each request from a specific client object uses the same properties unless an explicit QueryOptions or WriteOptions gets passed in. It's a weird debugging situation to start a request that blocks with token A and then change the token before starting a request with token B, since the first request will continue to use token A.
I just spent a couple hours tearing the config code apart and it looks like the main problem is that there are a bunch of janky properties for the old-style config that are obsolete but not removed, e.g. ConsulClientConfiguration.DisableServerCertificateValidation which actually sets a callback on the HttpHandler of the HttpClient. 😞
Since old-style config mutates the HttpHandler and/or HttpClient, I have to call a method to update them if the config is changed, and thus I can't just rely on the fact that reference assignment is atomic and say "oh yeah just go ahead and swap out the ConsulClientConfiguration I guess."
I think I've got a working thing though it's a bit rough around the edges because reconfiguring in a safe manner has to dispose of the existing HttpClient, and thus means that all current connections over that HttpClient throw a TaskCancelledException.
I've made an alpha package: https://www.nuget.org/packages/Consul/<IP_ADDRESS>-alpha1
Let me know if the ConsulClient's Reconfigure method works for you.

Oh yeah one addendum: there's now a saveOverrides argument on the ConsulClient constructor that you might find useful when constructing your base case. It keeps a reference to the delegates that you use to configure the constructor and re-runs them when you Reconfigure, otherwise everything has to be Reconfigured from a fresh state.
Also feel free to suggest a better way to do this. That's why I made it an alpha package - so I can twiddle the API before releasing it for real.

Thanks for the work!  I will check it out and let you know in the next day or two how it works out.

Did you ever get a chance to check this out @chrishoffman ?

Sorry for the delay.  I did and immediately got concerned that it added additional complexity to the maintenance of this library.  I took your advice and worked in creating bootstrap instances of all my default clients and binding my singleton instance to the authenticated client.  Thanks for taking the time to work out this solution.

Awesome, thanks for letting me know.
This exercise actually let me find and fix a couple of other bugs, which I'm going to cherry-pick into main and update but good to hear you figured out the bootstrap instance stuff.


some issues

Using asio drivers with 16 audio cables

anything labeled mix is mic inputs that can freely be controlled in ableton live, and speakers is output, also can be freely controlled, translator works but outputs some issues after translating and speaking it

fixed by reversing the order with my virtual cables


launchUrl from launchSettings.json should be used

Follow the instructions at the Microsoft Web API tutorial-Create a web project
dotnet new webapi -o TodoApi
cd TodoApi
code -r ../TodoApi

^F5 and it launches a browser to http:localhost::<port> not  "launchUrl": "swagger", from  launchSettings.json
That's not a good experience for our customers.
VS output has:
Using launch settings from 'C:\tmp\TodoApi\Properties\launchSettings.json' [Profile 'http']...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5072
warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
      Failed to determine the https port for redirect.

cc @TAGC
See this SO that reports the same problem
Dup of  closed #2935

@Rick-Anderson Currently VS Code doesn't use launchUrl from launchSettings.json. Doing so is a fairly significant effort.
In the mean time, the way to make this work is to change launch.json. Add uriFormat to serverReadyAction:
            "serverReadyAction": {
                "action": "openExternally",
                "pattern": "\\bNow listening on:\\s+(https?://\\S+)",
                "uriFormat": "%s/swagger"
            },

@gregg-miskelly  but we have dozens of tutorials based on dotnet new and it's a significant effort for the 50K + VSC customers every month who try our tutorials to make this change. It's a security best practice which I think would warrant the significant effort.

This issue is now fixed when using the dotnet debugger type, which is what one will get by default when using C# Dev Kit in a solution without a launch.json. So I am resolving this as fixed.


Extended page about functional programming

Thought the topic was super interesting, also added contribution instructions for the Linux terminal. (Asssssummming it works on Windows but I haven't tested)
Thanks! :-)

Patched according to review. 😄
Simplified, then expanded upon a couple bits, really hope I didn't open a can of worms lol


[Bug][Uwp] TextValidationBehavior inconsistent when not setting ValidStyle

Description
I implemented email validation, following this example,
However, on UWP it isn't really consistent, as long as a "ValidStyle" isn't added. Shoulden't the "Valid" style default to whatever style the control had without the behaviour?
Steps to Reproduce

Add a validator like the linked example and run the code
Add "test@test" as input text
Unfocus (Text becomes red, correct!)
Change text to<EMAIL_ADDRESS>Unfocus (Text becomes black, correct!)
Focus back (Text becomes red, feels incorrect!)

Expected Behavior
A black text when setting the focus back
Actual Behavior
A red text
Basic Information

Version with issue:
1.0.0-pre5
Last known good version:
?
IDE:
Platform Target Frameworks:

iOS:  Seems to work
Android: Seems to work
UWP:  1903

Android Support Library Version:
Nuget Packages:
Affected Devices:

Workaround
If you set a "ValidStyle" with black text, it's correctly set back to black, when focusing

Hi @Brosten Thanks for this report!
Does it work as expected on other platforms (Android / iOS)?

Also, I wonder, is "Focused" event raised on step 6

Yes, it does work fine on android and ios.
Yes, Focused event is triggered on the Entry control on step 6.

@pictos would you like to debug this issue on UWP?

I'll do it asap

if it becomes red, it means that "IsValid = False" for some reason

I'm able to reproduce the behavior

For some reason, the ValidStyle is null, any thought @AndreiMisiukevich ?

Yes, ValidStyle should be null (Because we don't set it)
But why UWP entry applies "InvalidStyle" when Null is set

I do not understand why it works fine on step number 5?

Can you try to clear style somehow?
Maybe even set new empty style (new Style())

@AndreiMisiukevich even with an empty style, I can see the issue. Also, the Focused event doesn't trigger (I don't know if we use it at some point)

iOS and Android doesn't seem to need the ValidStyle in order to work as "expected".

I am pretty sure it's an XF bug (since it works fine on iOS and Android)
But maybe we can find a workaround


Script launched but no action

Preparation

[X] I tested the latest release
[X] I looked at other issues (even the closed ones)
[X] I read the Troubleshooting Guide

FGO server
NA
FGA build number
1488
Describe the bug
Upon launching my script, my screen's scanned but no click is made. Be it the Quest or the Support selection or battles, the App scans correctly but nothing's done.
Video
https://user-images.githubusercontent.com/78726430/132144483-93f6523a-1208-47bb-a541-c2e535634430.mp4
Device model
Huawei P Smart
Android version
9
Screen size
2160*1080
RAM
4GB

You are not recording using FGA, which messes up all image detection until you stop and start the FGA service again.
Also, your notch behaves weirdly. Change this system configuration: https://consumer.huawei.com/en/support/content/en-us00753709/


Getting the wrong post back

I created a new paste and typed in "1111".  After submit, I see previous paste that was deleted due to age.  It seems that that the URL returned is pointing to something that used to exist but aged out.  I've cleared browser cache.

Do you use a web cache such as varnish?


index.js:155 Uncaught Error: Cannot find module './typeTrie'

@IvanSanchez Hi, how did you solve this before?

Can you use preval.macro to load it on build time? @orisano
As I did in https://github.com/linonetwo/segmentit/blob/ed33faa10f928ec5f9e698b6af9afb54d45e7d7d/src/knowledge/index.js#L2-L11

@IvanSanchez Hi, how did you solve this before?

I cannot recall. I'm not very familiar with how this project undergoes bundling.

Solving require problem in a web project is not easy, can you make it easier on your side? @IvanSanchez


Bootstrap modal options manipulation issue after initialisation.

Problem:
According to documentation in https://getbootstrap.com/docs/4.0/components/modal/#via-javascript, modal options can be passed via javascript $().modal method. However, after the modal is initialised, when I passes another option object into .modal method as parameter, newer options is not effective.
For example, initially, the #exampleModal has its options set as
$("#exampleModal").modal({
          "backdrop": "static",
          "show": false
})

#examplemodal behaves as  expected. The user cannot dismiss the modal by clicking the backdrop. However, in another part of the program, when I try to set the option of #exampleModal to be this one
$("#exampleModal").modal({
   "backdrop": true
})

However, The modal cannot be dismissed when the user click the backdrop of the modal.
Expected behavior:
The modal can be dismissed by clicking the backdrop after "backdrop": true option is set.
Demo link:
https://jsbin.com/qotoguv/edit?html,js,output

you should destroy your older modal before that, because here you create new modal each time so to do what you want you have to do :
$('#exampleModal').modal({
  backdrop: 'static',
  show: false
})
$('#exampleModal')
  .modal('dispose')
  .modal({
     backdrop: true
  })

Opps. Where can I find the documentation of dispose method of modal object?

Oops not in our docs but in our code 😯

Is it working as expected with the use of dispose ?

Yes it works well. Thanks for your help 👍 .


Place one widget in one direction and other one in other?

Describe the bug
It doesn't sound like a bug, but there isn't a way (without some hackary with previous values for avaliable width on previous frame) to actually place two widgets on one row with layouts facing different directions (maybe someone familiar with DockPanel in WPF, this basicaly what functionality layout system misses)

Without a clear picture of what you are talking about (and what code you tried) it is very difficult to classify this as a bug. Sounds more like a limitation of immediate mode that will be solved if/when we add multipass support.


Reuse constant OutputChannel instead of creating a new one

Will not create a new OutputChannel on every script execution anymore.

sorry for the delay - thanks a lot!


usb host not work

I want to connect a usb keyboard to the licheepi zero , But after connecting it is not recognized
my branch is dunfell

I updated dts. Please try 'kirkstone' branch.

Can You give some feedback whether it works? Thanks.

sorry.
I edited the files with the help of another source
Finally it worked properly

sorry.
I edited the files with the help of another source
Finally it worked properly


Remove LangVersion from server-side Blazor project template

Fixes https://github.com/aspnet/AspNetCore/issues/9168

The helix failure seems unrelated. Merging this in.


XXX James Charles Alleged Leaked Video On Reddit

01 seconds ago — Where I can watch James Charles Full Video on Redit? WATCH HERE! Viral James Charles Full Video Instagram, Twitter (X), Discord.
Watch🟢 ➤James Charles Leaked Video HD
DOWNLOAD👉 James Charles Leaked Video Full HD
XXX James Charles Alleged Leaked Video On Reddit James charles leaked video goes viral james charles leaked video James charles apology for leaked video James Charles Viral Video Click here to view Brace yourself for the most talked-about footage of the year
James charles leaked video goes viral james charles leaked video James Charles Viral Video Click here to view Brace yourself for the most talked-about footage of the year!
James Charles video took the internet by storm and amazed viewers on various social media platforms. James Charles, a young and talented digital creator, recently became famous thanks to this interesting video.
First shared on TikTok, James Charles video quickly gained attention on other social media platforms and took her online presence to the next level. Let’s dive into the origins, growth, and impact of this viral trend by examining its concept, implementation, and unique impact on online communities.
Who is James Charles? James Charles is a creative young digital artist widely known for her amazing James Charles videos. Initially shared on TikTok, the video quickly gained attention on various social media platforms and further strengthened Sophia Rain’s online reputation.
Let’s take a closer look at the origins, growth, and impact of this viral trend. We explore this unique idea and how James Charles brings it to life in her video.
Dillon shared the recent video after various other posts he shared on social media about Nina. The video shows a woman, whoDillon believed is Nina, in anintimate setting alongside an elderly gentleman. The woman is seen showing off her private parts.Dillon claimed he possesses several other embarrassing photos and videos of Nina, saying, “I wanna drop these nukes I have of Nina so bad it would literally break the internet.”
James Charles James Charles Video Instagram
James Charles became famous online thanks to her James Charles videos, which were first posted on TikTok. The video quickly became famous and received millions of views, shares and likes. In the video, James Charles dresses up as James Charles and shows off some impressive superhero moves.
The accompanying background music adds to the fun and lively atmosphere of the video. Viewers love James Charles videos for their creativity and entertainment value. His smooth and James Charles movements managed to fascinate the audience and many shared the video with others.
It’s like a digital party that everyone wants to join. This viral success made James Charles stand out and showed how creativity can create something truly unique. It’s like spreading joy online, and James Charles videos have become a source of joy for many people.
Reaction to James Charles video on social media
James Charles video has sparked heated debate on many social media platforms, especially on Reddit. The Reddit community has been the center of various discussions ranging from criticism, praise, and discussions about Sophia Rain’s online presence, content, and famous James Charles videos.
These diverse discussions on Reddit contribute to the dynamic online narrative surrounding James Charles. Users have different perspectives, thus encouraging lively dialogue that explores different perspectives on their work and sparks interest and engagement.
James Charles’s Reddit community serves as a virtual meeting place where people can express their thoughts and ideas. Continued engagement on Reddit has helped expand James Charles’s reach beyond her initial TikTok audience.
Increased visibility on Reddit allows Sophia Rain’s content to be received by a wider and more diverse audience. Sophia Rain’s online journey is not just a viral sensation. Instead, he posted a series of captivating videos aimed at cementing his reputation as a rising digital personality.
{Full Watch Video} James Charles Twitter Reddit: Costume Video
The post will describe details about James Charles Twitter Reddit, the Costume Video, and Tubi videos.
Do you know James Charles, who became famous for her James Charles video? The video has again become a topic of discussion among the people of Australia, Canada, the United States, and the United Kingdom since the video once again began circulating online.
In this post, we will discuss James Charles’s Twitter Reddit video and find out more details about the footage. James Charles Twitter Reddit James Charles became an online sensation after she uploaded a video of herself wearing a James Charles costume and posing in various poses. The video gathered LimeLight in no time, and as it was uploaded online, people started sharing it on several social media platforms, including Twitter and Reddit. The costume video of James Charles became a topic of discussion among people, and they were eager to find the video online. The Video was first extracted from the TikTok platform, and since then, it has been taken to public media platforms where the viral video stood out for creativity.


Route / doesn't work with absolute=false

Hi!
Because of the removal of last /,  the home (/) route link doesn't work with Ziggy.
An update in the regexp should do the work. (I can do it if you want)
https://github.com/tighten/ziggy/blob/f2b43c03e49b0f717168b1d578c8c4f8c423daca/src/js/Route.js#L119-L119
Thanks,
Matt'

Oh good catch. Yeah if you can PR that (with a test please!) that would be great, thanks. Otherwise I'll do it Friday.


tf.image.crop_to_bounding_box or tf.image.crop_and_resize can be used?

Hi, I want to know that if tf-coreml support crop ops ?

@JackHenry1992 could you please try latest version of tf-coreml?
crop_and_resize support is added.
feel free to re-open if you need more help here


Child Entities Lag Behind Parents when using RigidBody::KinematicVelocityBased

As reported in the discussion #230:

Using Heron 2.2.0 with 2d feature in bevy 0.6.1:
When creating child entities (with sensors attached, and a visualization component like a circle from the lyon crate), the children lag behind the parent when using velocities to move the parent rigidbody which is of type RigidBody::KinematicVelocityBased.
When creating the same structure directly with rapier2d, the same lagging behind can't be observed, so I assume it has to do with heron directly.
Is that a known issue, or is there something special that needs to be considered when using child entities with rigidbodies?

I observed a similar lag when I tried to sync a camera to a body.
My guess: heron's step systems are responsible for updating bevy's Transform (see here). They are running in CoreStage::PostUpdate (see here). bevy's GlobalTransform are being updated in the same stage. Its doc says:

This system runs in stage CoreStage::PostUpdate. If you update theTransform of an entity in this stage or after, you will notice a 1 frame lag before the GlobalTransform is updated.

I was able to fix my problem with
.add_system_to_stage(
    CoreStage::PostUpdate,
    set_camera_to_player
        // The player's `Transform` is updated here
        .after(PhysicsSystem::TransformUpdate)
        // The camera's `Transform` is used here
        .before(TransformSystem::TransformPropagate),
)

Yes, this is the problem (and solution).
I just didn't have time to solve it yet as I was on holiday. Hopefully (but unsure), I may have time this weekend.
If you want to fix it yourself and open a pull request, you can. Just don't forget to add a test ;-)

Actually, after a deeper look, I cannot manage to create a test that reproduces the problem.
@Occuros, could you share how to reproduce?


Making 2nd arg to parseConfig() optional

@renatoi @thierryk
This makes it easier to use the parseConfig() API outside of getCss() since we may not always need to pass options

CLA is valid!

Coverage remained the same at 100.0% when pulling 7a95db6adbc9a6187e9a122bd4797d04685c8267 on parse-no-options into 5d67f92c5a17f9c0f50a02346cc0b2b90e6ca409 on master.

Coverage remained the same at 100.0% when pulling 7a95db6adbc9a6187e9a122bd4797d04685c8267 on parse-no-options into 5d67f92c5a17f9c0f50a02346cc0b2b90e6ca409 on master.

LGTM


rule present in array items validation

Hi. First of all thanks for such a great package.
I've come accross issue
If i have request with  the following rules
 return [
      'config' => ['required', 'array'],
      'config.*.key' => ['required', 'string'],
      'config.*.value' => ['present', 'nullable']
  ];

the result of transformation is
export interface ConfigUpdateRequest {
    config: Array<{
        key: string;
        value: present | null;
    }>;
}

which is incorrect because present is not typescript built-in type nor interface

seems like this rule is missing in the CONTROL_KEYS const in RequestGenerator.php#L21


Allow calling union types with different call signatures when arguments are unions of types with at least one type satisfying one of the functions and a type guard narrows the argument union to the correct type at runtime

Search Terms

calling union types
Suggestion

Give TS the ability to infer that calling a value that is typed with a union of functions of differing call signatures is valid when a type guard that narrows the union of functions to a function, or a new union of functions with identical signatures, is used in a conditional expression to select arguments with the correct type to be passed.
Use Cases

Creating a TypedArray using a variable TypedArrayConstructor:
declare function isBigInt64ArrayConstructor(x: any): x is BigInt64ArrayConstructor

let x: Int16ArrayConstructor | Int32ArrayConstructor | BigInt64ArrayConstructor

// From this
function doStuff(y: number) {
  switch (y) {
    case 0:
      if (!isBigInt64ArrayConstructor(x))
        return x.of(0, 1)

      return x.of(0n, 1n)
    case 1:
      if (!isBigInt64ArrayConstructor(x))
        return x.of(1, 0)

      return x.of(1n, 0n)
    case 2:
      if (!isBigInt64ArrayConstructor(x))
        return x.of(0, 1, y)

      return x.of(0n, 1n, BigInt(y))
  }
}

// To this
function cleanerDoStuff(y: number) {
  const [ZERO, ONE, WHY] = isBigInt64ArrayConstructor(x)
    ? [0n, 1n, BigInt(y)]
    : [0, 1, y]

  switch(y) {
    case 0:
      return x.of(ZERO, ONE)
    case 1:
      return x.of(ONE, ZERO)
    case 2:
      return x.of(ZERO, ONE, WHY)
  }
}

Examples

This does not work as of TS 3.7.5:
interface iTakeNumbers {
  (x: number)
  takesBigInts: false
}

interface iTakeBigInts {
  (x: bigint)
  takesBigInts: true
}

type iTakeNumbersOrBigInts = iTakeNumbers | iTakeBigInts

let x: iTakeNumbersOrBigInts

function doesTakeNumbers(x: iTakeNumbersOrBigInts): x is iTakeNumbers {
  return !x.takesBigInts
}

const ZERO = doesTakeNumbers(x) ? 0 : 0n

if (doesTakeNumbers(x)) {
  // Works as TS narrows x to iTakeNumbers
  x(0)
  /**
   * Case 1:
   * Argument of type 'bigint | 0' is not assignable to parameter of type 'number'.
   * Type 'bigint' is not assignable to type 'number'. ts(2345)
   */
  x(ZERO)
} else {
  // Works as TS narrows x to iTakeBigInts
  x(0n)
  /**
   * Case 2:
   * Argument of type 'bigint | 0' is not assignable to parameter of type 'number'.
   * Type '0' is not assignable to type 'number'. ts(2345)
   */
  x(ZERO)
}

/**
 * Case 3:
 * Argument of type 'bigint | 0' is not assignable to parameter of type 'never'.
 * Type 'bigint' is not assignable to type 'never'. ts(2345)
 */
x(ZERO)

In the 1st and 2nd case, ZERO should be narrowed down to the appropriate type as the compiler should be able to infer that doesTakeNumbers is pure and thus defining ZERO with a conditional expression at the top level is equivalent to defining ZERO inside both the if and else blocks with the appropriate 0 for each respectively.
In the 3rd case, the compiler should be able to infer that ZERO will be the correct type for use as the argument to x during runtime since ZERO should be conditionally typed correctly based on the result of the type guard doesTakeNumbers called with x. Maybe this could be done with an extension to the existing conditional types where the compiler could infer the type of ZERO to be a conditional type instead of a bigint | number,
Checklist
My suggestion meets these guidelines:

[x] This wouldn't be a breaking change in existing TypeScript/JavaScript code
[x] This wouldn't change the runtime behavior of existing JavaScript code
[x] This could be implemented without emitting different JS based on the types of the expressions
[x] This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
[x] This feature would agree with the rest of TypeScript's Design Goals.

Related to or duplicate of #12184; you want to propagate control flow analysis in a way not currently supported.  Every time I think about this sort of problem I conclude that it would likely be a compiler performance disaster to have it automatically track these correlated possibilities, and #25051 was my attempt at a feature request for manual instead of automatic tracking.


Global updates breaking DBs of entries. (Mangadex specifically)

Steps to reproduce

Add any random entry from mangadex to library
Mark all chapters as read
Start global update
See chapters from entry missing/duplicated/marked as unread

Expected behavior
Chapter list from the entry to not break after a global update
Actual behavior
Entry's DB seem to break up after a global update, making some chapters appear as missing/unread/duplicated
Crash logs
No response
Mihon version
TachiyomiSy 1.10.2 (Based on latest Mihon version)
Android version
Android 10
Device
SP-6150
Other details
A few days ago I made a similar issue on the "other" repo where an issue pertaining a source would be made in, however they closed that issue saying it was an app issue and not something that they could fix (I won't cross link the issue here due to policy reasons but you can find it on my profile activity).
There's some relevant info in that other issue that I don't really want to reiterate. However, since then I've figured out a bit more about what's happening, and it seems to be something related to connection issues when the global update happens (yesterday I did a global update and it went fine, however today I was downloading some stuff on my PC when the global update happened on my phone and issues arose again). Now, my connection isn't exactly the fastest and entries failing to update due to connection issues have happened before, however it was only after the 0.15 update that my manga entries started breaking like this:

With these kind of errors:

I'm also making the issue here and not on SY's repo because another user (in that other issue I mentioned) also managed to reproduce the behavior on 0.15.3
Acknowledgements

[X] I have searched the existing issues and this is a new ticket, NOT a duplicate or related to another open or closed issue.
[X] I have written a short but informative title.
[X] If this is an issue with an official extension, I should be opening an issue in the extensions repository.
[X] I have gone through the FAQ and troubleshooting guide.
[X] I have updated the app to version 0.16.1.
[X] I have updated all installed extensions.
[X] I will fill out all of the requested information in this form.

I seem to be having this same bug. At the very least the duplication of chapters has happened to me. I first noticed this on Tachiyomi so I made the switch over to Mihon to see if this happens there too. I still haven't noticed this on Mihon, but the duplicated chapters carried over to Mihon with the backup.

I also have this issue, but even more severe. With global update I notice duplicated/missing chapters, read chapters marked as unread and broken chapter date times resulting in complete mess in my library.

When I update specific title it fixes date times and missing chapters but not duplicate chapters/unread.
I'm using SY 10.0.2, but update to 10.0.4 didn't fix this. I checked logs but on default log level couldn't find anything specific and I don't think it's related to internet as I think my connection is quite stable and fast enough. I wonder if this is some kind of corruption with library database when global update is performed.

Well, I've pretty much mitigated the issue by disabling the scheduled updates and just doing the global updates myself.
I've noticed however that the download index sometimes just breaks whenever I open up the app after a while, so maybe that is part of the issue as well, though I have no idea why it's just mangadex that is being affected.

This is just an idea but, could this be because we have both Mihon and Tachiyomi installed?
I noticed that even though I set up Tachiyomi to never update (manual update), and Mihon to update every twelve hours, the library kept being updated on Tachiyomi and it never updated on Mihon, unless manually updated.
Perhaps having both apps installed caused some kind of conflict, oerhaps with the extensions, because since I uninstalled Tachi and left only Mihon, it began auto-updating properly.
Also this issue with repeated chapters stopped altogether.

I only have SY installed, so I doubt it's an app conflict issue. Either way I'm a little apprehensive on trying to replicate the issue anymore on my end since it's a bit annoying to get all my entries back in order.

Now I have only SY, but I tried other versions and uninstalled them after. Also removing and reinstalling extensions didn't fix the problem.
For now I just update whole library as many entries have irregular update cycle and it's irritating to check them separately.
@serveral1 is manual category update working for you without problems?

yeah, triggering the global update manually works for me without a hitch, it's the automated global updates that seem to break everything when the app is closed/sleeping.

I haven't noticed this recently, so I think it is resolved in some way.

https://github.com/mihonapp/mihon/issues/647


NodeJS Described

Description
In this issue, I will be providing audio containing a brief description of NodeJS and its usage.
Domain
Frontend Dev HTML/CSS/JS
Type of Contribution
Audio
Code of Conduct

[X] I follow Contributing Guidelines & Code of conduct of this project.

/assign

/assign
Please guide me on how to get the issue?
Do we have to create the issue ourselves and assign it ourself?
What do we need to do sir @github-actions


Is it possible to change sidebar's font colour?

I'm not sure if it's possible or whether it should be added as a feature request. Can anybody help?

@moseleyi yes via settings:
"workbench.colorCustomizations": {
    "sideBar.foreground": "#ff0000"
}


Trying to read plugins.flutter.io/package_info' for web causes Overflow on channel

Steps to Reproduce
1 - Add this to any code:
MethodChannel _kChannel =  MethodChannel('plugins.flutter.io/package_info');
final Map<String, dynamic> map =  await _kChannel.invokeMapMethod<String, dynamic>('getAll');
Expected results:
To have  map["version"] and map["buildNumber"] populated as it happens on iOS and Android
Actual results:
Overflow on channel: plugins.flutter.io/package_info.  Messages on this channel are being discarded in FIFO fashion.  The engine may not be running or you need to
adjust the buffer size if of the channel.
Error: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/package_info)
at Object.throw_ [as throw] (http://yoda-dev.threadable.io:8080/dart_sdk.js:4458:11)
at MethodChannel._invokeMethod (http://yoda-dev.threadable.io:8080/packages/flutter/src/services/platform_channel.dart.lib.js:410:21)
at _invokeMethod.next ()
at http://yoda-dev.threadable.io:8080/dart_sdk.js:37107:33
at _RootZone.runUnary (http://yoda-dev.threadable.io:8080/dart_sdk.js:36961:58)
at _FutureListener.thenAwait.handleValue (http://yoda-dev.threadable.io:8080/dart_sdk.js:32048:29)
at handleValueCallback (http://yoda-dev.threadable.io:8080/dart_sdk.js:32595:49)
at Function._propagateToListeners (http://yoda-dev.threadable.io:8080/dart_sdk.js:32633:17)
at _Future.new.[_completeWithValue] (http://yoda-dev.threadable.io:8080/dart_sdk.js:32476:23)
at async._AsyncCallbackEntry.new.callback (http://yoda-dev.threadable.io:8080/dart_sdk.js:32498:35)
at Object._microtaskLoop (http://yoda-dev.threadable.io:8080/dart_sdk.js:37222:13)
at _startMicrotaskLoop (http://yoda-dev.threadable.io:8080/dart_sdk.js:37228:13)
at http://yoda-dev.threadable.io:8080/dart_sdk.js:32850:9Application finished.

Hi @phackwer
package_info isn't supported for web yet
Closing as duplicate of https://github.com/flutter/flutter/issues/46609


Does not send goodbye packets

When a service is unregistered (or the whole server undergoes clean shutdown), it should be sending a goodbye packet for any service it's previously announced to the world (see RFC 6762 §10.1). I don't see any evidence of this in the source.
The purpose of this is to allow other hosts that have cached the existence of services being broadcast by this server to learn that the service is no longer available.

Also note that it should only be sending goodbye packets for unique records. Shared records such as _services._dns-sd._udp. (see #3) should not have a goodbye packet.

Thanks for pointing this out. I though I have seen somewhere in the code that somewhere it reads that there should be some sort of goodbye functionality.
I just recently browsed the codebase in more detail. My current ambition would be to dump this project completely and start from scratch with a new implementation, as the current codebase is pretty fucked up (in my opinion) and it will end up in a rewrite anyway if you would try to correct things there.

Thanks for your issue. The bonjour library is about to be replaced by new ciao library (which is basically a rewrite). It includes support for sending goodbye packets, thus this issue is closed.


Make tikv-ctl used via relative path when encryption is enabled

Signed-off-by: TXXT<EMAIL_ADDRESS>
What problem does this PR solve?
close #7886
Problem Summary:
relative path cannot be key in encryption dictionary, let's canonicalize it.
What is changed and how it works?
canonicalize kv_path and raft_path
Related changes
None
Check List
Tests

Manual test (add detailed scripts or steps below)

Side effects
No
Release note

Fix bug where tikv-ctl does not support relative path

/merge

/run-cherry-picker


HDDS-7570. Provide a shareable ofs://temp directory

What changes were proposed in this pull request?
An ofs tmp directory that is common and shared for all users of ofs applications requiring a temporary directory /tmp.  Use cases include applications such as mapreduce and spark that make use of /tmp from the filesystem.
Providing a common shared /tmp directory for ofs allows allows administrators to effectively configure and administer the directory for all users with enforceable access controls and quota policies.
Currently, the ofs://tmp directory is a virtual directory configured by the admin but not shareable for all users.  Instead each user creates their own tmp directory for use with ofs.  Because of the implementation, each tmp directory can only be administered by the individual users.  Administrators currently are unable to access user tmp directories. thus administer the tmp directories.
As with HDDS-2929 a virtual tmp directory is used by ofs users and ofs applications using ofs://tmp.  Instead of each user having their own tmp directories in the implementation, here a single tmp directory is created from the tmp directory mount that is shared for all users.  Admins have all access and users can read/write files and only delete files owned by the user.
The ofs temp directory is configured with access control as follows:
with, ozone.om.enable.ofs.shared.tmp.dir = true in ozone-site.
admin is privileged user testuser2 (admin), regular user is testuser (user) in example with admin configuring ofs tmp directory mount for users:
ozone sh volume create tmp
ozone sh volume setacl -a user:testuser2:rw,user:testuser:a,group:testuser2:rw,group:testuser:a tmp
ozone sh bucket create tmp/tmp
ozone sh bucket setacl -a user:testuser2:rwlc,user:testuser:a,group:testuser2:rwlc,group:testuser:a tmp/tmp

users access the tmp directory as in HDDS-2929,
ozone fs -put ./NOTICE.txt ofs://om/tmp
Sticky-bit behavior
Configured properly with access control, admin ALL, users R+W+L+C, the common tmp directory behaves like the sticky-bit directory of hdfs, HADOOP-3953 with files in tmp directory writable by all but files only deleted by owner and admin.
Open Questions
Q. What to do with the Trash service on the shared tmp directory, currently executing delete commands with -skipTrash option.
A. Addressed in the comments,
Only the admin/owner would be able to move to trash
trash service applied to the tmp directory as is operates on delete by placing the owner key in its ofs://tmp/tmp/tmp/.Trash/ path with Acls inherited from the tmp directory and contents.
Q. Need to support quota on tmp directory.  This should be able to be applied at either the tmp volume level or tmp bucket level for the virtual ofs://om/tmp path.  However, space-quotas appear to not be enforced at the volume level (bug?) and when applied to the bucket level tmp it is enforced but any user that has write permission to the tmp directory can set the quota.  For bucket space quotas, only the admin and owner of the bucket should be able to set the quota.  Why is it that all users that can access the bucket can set the quota?
What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-7570
How was this patch tested?
Tested by ofs integration tests, acceptance tests and manually tested with dev secure docker cluster.
Integration test: TestRootedOzoneFileSystem#testSharedTmpDir
Acceptance test: robot --test "Test tmp mount for shared ofs tmp dir" ozone-secure-fs.robot
The test creates virtual ofs://tmp directory, sets access control and tests putting files into tmp dir with privileged user and regular user.  Tests for sticky-bit behavior - all users write, file only deleted by root and owner of file.

Yes this shouldn't be a problem as the trash emptier is run by the user that starts the OM process so by default it should be an admin so it should be able to issue deletes. However I agree with the idea of disabling trash for the directory as most items in tmp will eventually get deleted after application completes.

@smengcl , @sadanand48, should we update this PR from drafted to a full PR.  If there are no significant changes needed, can we update this?

Thanks @neils-dev for the draft PR! I read the description and the overall implementation sounds good to me.

Q. What to do with the Trash service on the shared tmp directory, currently executing delete commands with -skipTrash option.

IIRC the current trash deleting service should have been already scanning every single bucket's hidden .trash folder. Hence I don't see why we need to worry about that here?
I'm +1 on marking this ready for review. Note the minor conflict in TestOzoneConfigurationFields.

@smengcl , following up on quota support for the ofs tmp directory discussed offline earlier, I've found that,
space-quotas appear to not be enforced at the volume level (bug?) and when applied to the bucket level tmp it is enforced but any user that has write permission to the tmp directory can set the quota. For bucket space quotas, only the admin and owner of the bucket should be able to set the quota. How is it that all users that can access the bucket set the quota?
@sadanand48 , thoughts on this?
OZONE-SITE.XML_ozone.om.enable.ofs.shared.tmp.dir=true
ozone sh volume create tmp
<set acls as in patch tesed description>

ozone sh volume setquota --space-quota 10 /tmp
(not enforced)

ozone sh bucket setquota --space-quota 10 /tmp/tmp
(enforced, but all users with write access to tmp directory can set quota, update quota)

I've found that,space-quotas appear to not be enforced at the volume level (bug?)

Filed HDDS-7652 for this.

How is it that all users that can access the bucket set the quota?

I think there are some bugs in the acl check code path, I was even able to delete a volume and a bucket using a user that was neither admin/owner

Thanks @sadanand48 for looking into the space quota issue with volumes and filing the jira,

Filed HDDS-7652 for this.

I've also filed a jira for looking into supporting only Admin level permissions to set and clear quotas.  This is similar to HDFS quotas and the intent of what is documented in the Ozone quota design in HDDS-541,  The jira I filed is HDDS-7697,
https://issues.apache.org/jira/browse/HDDS-7697 .
What I would like to do is refer to the jiras filed for tracking quota support for the shareable tmp ofs directory.  This PR focuses on a patch to provide a shareable tmp ofs directory.  If we can, I'd like to prepare to finish this PR to support the shared tmp ofs directory.  @smengcl what do think?

Note the minor conflict in TestOzoneConfigurationFields.

Thanks @smengcl .  Please take another look and lets try to complete this PR as is.  Separate jiras have been filed for quota issues to support tmp dir quota support.

Thanks @neils-dev for working on this! Thanks @sadanand48 for reviewing this.


Correct AutoGPT import in autogpt.ipynb

Take into account modification of the structure of the experimental folder to load the AutoGPT class
Correct AutoGPT import in autogpt.ipynb considering new experimental folder structure
The former block in  https://python.langchain.com/en/latest/use_cases/autonomous_agents/autogpt.html :
from langchain.experimental import AutoGPT
from langchain.chat_models import ChatOpenAI

Was not loading AutoGPT as the structure of the experimental folder changed.
This PR fixes module import for AutoGPT
Who can review?
Community members can review the PR once tests pass. Tag maintainers/contributors who might be interested: @vowelparrot ?

What version of langchain are you using?
from langchain.experimental import AutoGPT

still works on the main branch

Hi,
I've installed it via conda. langchain.version is 0.0.161
My bad, i should have clone the main branch instead, but at least you know that the conda release may be broken for that part.
Best,
Julien


Unable to use spanish characters for the Service Provider name

Environement
Standalone 5.4.0 GA pack
JDK - 1.8
DB - H2
OS - Ubuntu 15.10
Steps to recreate the issue

Register SP by providing the SP name with Spanish characters
ex: Janucá

Observations
Unable to user Spanish characters for the SP name
Provided error message is generic and does not reflect whether we support spanish characters or not

Thank you for your contribution!
We are closing this issue since it has not been prioritized for a long time. Chances are that it has already been solved in more recent versions. If not, we will be re-evaluating this when it becomes a priority.


Doubletap should zoom to the region which has been tapped

Currently it zooms to the center of the image/child widget. We have a rather big diagram as the child widget and it would be nice to quickly zoom to specific parts at a pre-defined zoom level. The part could be the exact location tapped or even better would be if it could snap to a grid.

Currently this case is actual. With a double tap in a certain area, the zoom occurs only in the center. How can I zoom to specific places?

@renancaraujo Currently this case is actual. With a double tap in a certain area, the zoom occurs only in the center. How can I zoom to specific places?

It is still the issue. Is it on the list to be implemented? 4 years have passed since then..

It is still the issue. Is it on the list to be implemented? 4 years have passed since then..

It is in the list but I didn't have time to address since it requires quite a refactor. Do you have any suggestions?

Any workaround ?


Add x-artifact-duration header to PUT

Close #69 (nice)

Would this be the life time of,the uploaded artefact?


After adding my 1 and only garage door in Step 2, it asks me to Add New Garage Door (step 3)

But, of course, there is no other door, so it fails...
Is there a simple way to ask how many doors you want to add and then run the process 'that many' times??
Thanks
A

Same issue here - been over a month and no response?

@ajardolino3 any ideas?
I personally just use the drivers directly without the ap

Have given up for the moment... am using directly in Home App... Siri listens to me , but geolocation not activating the routine (despite the tab showing that I have left the building!) and rather annoyingly Siri (on my phone) won't activate the routine as I am driving back to the house, unless the phone is unlocked... which rather negates the point, although interestingly, Siri on my Apple watch WILL open the door, so I have to whisper to the watch so the phone can't hear!!

When adding your garage door, I believe the app may have the wrong wording.  Step 2 is the name of your hub/meross device.  Step 3 is the name of the door the device is controlling.  When I first set mine up, I only had one door, too, and it was confusing because I named both the device and the door the same thing.  Hope this helps.

Step 1 for me is username/password/device IP
Step 2 auto-populates with my single garage door MSG100 unit's name I have configured on the meross app
Step 3 looks like it's trying to populate a list of MORE garage doors, but since I don't have any - it will not continue and brings up an error when I click next, that I HAVE to pick a selection to continue, but there is nothing to select but an empty list.
When I try to add the driver manually and add the IP address of my meross unit, it asks for all kinds of more information:
Key:
MessageID:
Timestamp:
Sign:
UUID:
Garage Door Port:
Garage Open/Close time in seconds:
I was able to see in the hubitat log with debugging enabled what the UUID and Key are, but I see different data showing up like token and userid, not "Sign" or "Message ID".
I found a python script I could run to try and find the other variables and ran into this script:
`import base64
import hashlib
import string
import random
import requests
import time
def rand_gen(size, chars=string.ascii_lowercase + string.digits):
return str(''.join(random.choice(chars) for _ in range(size)))
def msg_id(unix_time):
concat_string = '{}{}'.format(rand_gen(16), unix_time)
final_md5 = hashlib.md5(concat_string.encode('utf-8')).hexdigest()
return str(final_md5)
def get_unix_time():
current_time = int(time.time())
return current_time
def get_key(username, password, uts):
nonce = rand_gen
unix_time = uts

param = '{{"email":"{}","password":"{}"}}'.format(username, password)
encoded_param = base64.standard_b64encode(param.encode('utf8'))

concat_sign = '{}{}{}{}'.format('23x17ahWarFH6w29', unix_time, nonce, encoded_param.decode("utf-8"))
sign = hashlib.md5(concat_sign.encode('utf-8')).hexdigest()

headers = {
'content-type': 'application/x-www-form-urlencoded',
}
data = {
'params': encoded_param,
'sign': sign,
'timestamp': unix_time,
'nonce': nonce
}
response = requests.post('https://iot.meross.com/v1/Auth/login', headers=headers, data=data)
key = response.json()['data']['key']
userid = response.json()['data']['userid']
token = response.json()['data']['token']
return str(key), str(userid), str(token)

def signing_key(message_id, key, uts):
concat_string = '{}{}{}'.format(message_id, key, uts)
final_md5 = hashlib.md5(concat_string.encode('utf-8')).hexdigest()
return str(final_md5)
def login(username, password):
current = get_unix_time()
message_id = msg_id(current)
key, userid, token = get_key(username, password, current)
sign = signing_key(message_id,key, current)

print("{} {}".format("userId:", userid))
print("{} {}".format("key:", key))
print("{} {}".format("token:", token))
print("{} {}".format("messageId:", message_id))
print("{} {}".format("sign:", sign))
print("{} {}".format("timestamp:", current))

#ONLY MODIFY THIS
login("username/email", "password")`
Running that gives me the output in a format like this:
userId: 3628801 key: 340e1.....87fd token: 91524e1250......6246 messageId: d9fb.....173 sign: b1.....540 timestamp: 17......609
The script seems to use a random number generation which means the values will be different each time you run the script, but when I populate the driver in Hubitat with all the values from the python script, I am able to see the device respond to the web interface - it updates the state of the device with:
Current States
door : closed
contact : closed
version : 3.2.7
model : msg100
Clicking refresh does a POST command in the log which doesn't seem to have any errors with it...
But clicking open or close does nothing at all.
If I open the garage doors manually via physical button on the garage wall, or using the Meross app, then the web interface updates and says the door is opening and the contact is open.  So why don't the buttons work?  I feel so very close.  :(

Step 1 for me is username/password/device IP Step 2 auto-populates with my single garage door MSG100 unit's name I have configured on the meross app Step 3 looks like it's trying to populate a list of MORE garage doors, but since I don't have any - it will not continue and brings up an error when I click next, that I HAVE to pick a selection to continue, but there is nothing to select but an empty list.

But clicking open or close does nothing at all.
If I open the garage doors manually via physical button on the garage wall, or using the Meross app, then the web interface updates and says the door is opening and the contact is open. So why don't the buttons work? I feel so very close. :(

😬😬😬
I think your struggle says it all... I want a 'slightly' easier solution... OK... A much easier solution...  I know I am loosing abilities, but have got back a lot more time... "Siri, open the Garage Door." works for me, and while I haven't got the geolocation to work, at least Siri listens to me.
A

I believe the issue is that I only tested this app with an MSG200, not an
MSG100.  The MSG200 supports up to 3 garage doors.  The Meross API must
return the data differently for the MSG100.
Keep in mind, all the app does is simplify the setup of the devices.  If
you already have the devices setup, the app won't help you much.  Feel free
to modify/update the code for MSG100 and submit a pull request.
As far as automating with geolocation, I use the BLE Gateway app with a USB
dongle in my car.  When the cart pulls up to the house, the door
automatically opens everytime.  Automatic closing doesn't work as well,
given the nature of this technology, but I do have some rules in place that
if no one is home, to automatically close the garage door if its open.
Art
On Fri, Jan 12, 2024 at 7:09 AM cnyper @.***> wrote:

Step 1 for me is username/password/device IP Step 2 auto-populates with my
single garage door MSG100 unit's name I have configured on the meross app
Step 3 looks like it's trying to populate a list of MORE garage doors, but
since I don't have any - it will not continue and brings up an error when I
click next, that I HAVE to pick a selection to continue, but there is
nothing to select but an empty list.
But clicking open or close does nothing at all.
If I open the garage doors manually via physical button on the garage
wall, or using the Meross app, then the web interface updates and says the
door is opening and the contact is open. So why don't the buttons work? I
feel so very close. :(
😬😬😬
I think your struggle says it all... I want a 'slightly' easier
solution... OK... A much easier solution...  I know I
am loosing abilities, but have got back a lot more time... "Siri, open the
Garage Door." works for me, and while I haven't got the geolocation to
work, at least Siri listens to me.
A
—
Reply to this email directly, view it on GitHub
https://github.com/ithinkdancan/hubitat-meross/issues/12#issuecomment-1889156005,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AGE43XUWP47WW55JGVP4X23YOEYWZAVCNFSM6AAAAABAJFGX56VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQOBZGE2TMMBQGU
.
You are receiving this because you were mentioned.Message ID:
@.***>

I believe the issue is that I only tested this app with an MSG200, not an MSG100. The MSG200 supports up to 3 garage doors. The Meross API must return the data differently for the MSG100. >
Ahhh!!! Of course... that explains it...

Thanks for the response...
A


acme-sh: 3.0.0 -> 3.0.1

Automatic update generated by nixpkgs-update tools. This update was made based on information from https://repology.org/metapackage/acme.sh/versions.
meta.description for acme-sh is: "A pure Unix shell script implementing ACME client protocol"
meta.homepage for acme-sh is: "https://acme.sh/"
meta.changelog for acme-sh is: ""
Updates performed

Version update

To inspect upstream changes

Release on GitHub

Compare changes on GitHub

Impact

Checks done (click to expand)

built on NixOS
The tests defined in passthru.tests, if any, passed
/nix/store/jcl8283xzs4nnbbv3fv935dffa760022-acme.sh-3.0.1/bin/acme.sh passed the binary check.
1 of 1 passed binary check by having a zero exit code.
0 of 1 passed binary check by having the new version present in output.
found 3.0.1 with grep in /nix/store/jcl8283xzs4nnbbv3fv935dffa760022-acme.sh-3.0.1
found 3.0.1 in filename of file in /nix/store/jcl8283xzs4nnbbv3fv935dffa760022-acme.sh-3.0.1

Rebuild report (if merged into master) (click to expand)

3 total rebuild path(s)

2 package rebuild(s)

2 x86_64-linux rebuild(s)
1 x86_64-darwin rebuild(s)

First fifty rebuilds by attrpath
acme-sh
docbookrx

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/jcl8283xzs4nnbbv3fv935dffa760022-acme.sh-3.0.1 \
  --option binary-caches 'https://cache.nixos.org/ https://nix-community.cachix.org/' \
  --option trusted-public-keys '
  nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(The Cachix cache is only trusted for this store-path realization.)
For the Cachix download to work, your user must be in the trusted-users list or you can use sudo since root is effectively trusted.
Or, build yourself:
nix-build -A acme-sh https://github.com/r-ryantm/nixpkgs/archive/6d45bbd015c07f57bb8cea0762ef915b7086d8ac.tar.gz

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/jcl8283xzs4nnbbv3fv935dffa760022-acme.sh-3.0.1
ls -la /nix/store/jcl8283xzs4nnbbv3fv935dffa760022-acme.sh-3.0.1/bin

Pre-merge build results
We have automatically built all packages that will get rebuilt due to
this change.
This gives evidence on whether the upgrade will break dependent packages.
Note sometimes packages show up as failed to build independent of the
change, simply because they are already broken on the target branch.
Result of nixpkgs-review run on x86_64-linux 1

1 package built:

acme-sh

Maintainer pings
cc @balsoft @mkaito for testing.

Superseded by #153209


Stable CLI/library interface

Notes on stabilising the CLI/library interface:

Cosign and sigstore-python both use rekor-url and fulcio-url as option names for the base url, whereas we currently use rekor/fulcio-base-url

Suggestion: update to use --rekor-url/rekorUrl, --fulcio-url/fulcioUrl in CLI params and sign method params

CLI exposes signDSSE whereas the underlying method is called signAttestation

Suggestion: Update CLI method to sign-attestation
Q: Is there any guidance from in progress clients specs on what to call the sign/verify method that deal with dsse in-toto attestations?

Sigstore.utils currently exports createDSSEEnvelope and createRekorEntry

Should we explicitly mark these interfaces as "experimental" interfaces giving us the freedom to do breaking changes without major version bump?

verify exposes a tufRootPath option but we don't seem to use it anywhere yet?

Suggestion: remove this option until someone asks for it and maybe there's clear guidance from the sigstore tuf 2.0 spec?
It looks like the draft sigstore tuf client doc suggests setting this with a env var TUF_ROOT and it seems like cosign already supports this.

Digging into the tufRootPath, seems python sets this to the platform specific "data" dir: https://github.com/sigstore/sigstore-python/blob/main/sigstore/_internal/tuf.py#L60
@bdehamer thoughts on doing the same for sigstore-js? This might be helpful to crib some bits from to avoid adding a dep: https://github.com/sindresorhus/env-paths/blob/main/index.js
Also spotted this callout on sindresorhus/conf: "The ~/.config directory, it turns out, often have an incorrect permission on macOS and Windows, which has caused a lot of grief for users."


Mlproject path

I only found the typo in xgboost, the rest of them are the way you described.
Closes #283

I'm just leaving it this time. Maybe the shame will teach me a lesson.


App crashed on samsung

We can't provide the steps, this crash captured by "bugly" from our app running on real user's device. Please try to help us resolve this problem

device: some SAMSUNG
android version: 9
flutter version:  1.9.1+hotfix.4
exceptional thread/process:   com.mason.wooplus(30291)#1.gpu(30344)

the stack is:
1 #00 pc<PHONE_NUMBER>304f48 /vendor/lib64/egl/libGLESv2_adreno.so (EglWindowSurface::IsSingleBufferModeEnabled()+32) [arm64-v8a]
2 #01 pc<PHONE_NUMBER>32284c /vendor/lib64/egl/libGLESv2_adreno.so (EsxCmdMgr::Flush(EsxFlushReason)+2500) [arm64-v8a]
3 #02 pc<PHONE_NUMBER>2f3ef8 /vendor/lib64/egl/libGLESv2_adreno.so (EsxContext::Destroy()+48) [arm64-v8a]
4 #03 pc<PHONE_NUMBER>0d4c58 /vendor/lib64/egl/libGLESv2_adreno.so (EsxDevice::Destroy()+80) [arm64-v8a]
5 #04 pc<PHONE_NUMBER>146ab8 /vendor/lib64/egl/libGLESv2_adreno.so (EglDisplay::Terminate(int)+1144) [arm64-v8a]
6 #05 pc<PHONE_NUMBER>2fb61c /vendor/lib64/egl/libGLESv2_adreno.so (EglApi::SwapBuffers(void*, void*)+420) [arm64-v8a]
7 #06 pc<PHONE_NUMBER>00f1f0 /system/lib64/libEGL.so (eglSwapBuffersWithDamageKHR+636) [arm64-v8a]
8 #07 pc<PHONE_NUMBER>269164 libflutter.so flutter::AndroidSurfaceGL::GLContextPresent() (../../flutter/shell/platform/android/android_context_gl.cc:239) [arm64-v8a]
9 #08 pc<PHONE_NUMBER>528f68 libflutter.so operator() (../../third_party/libcxx/include/functional:1707) [arm64-v8a]
10 #09 pc<PHONE_NUMBER>2afa6c libflutter.so std::__1::function<bool (flutter::SurfaceFrame const&, SkCanvas*)>::operator()(flutter::SurfaceFrame const&, SkCanvas*) const (../../third_party/libcxx/include/functional:0) [arm64-v8a]
11 #10 pc<PHONE_NUMBER>2a5484 libflutter.so flutter::Rasterizer::DrawToSurface(flutter::LayerTree&) (../../flutter/shell/common/surface.cc:48) [arm64-v8a]
12 #11 pc<PHONE_NUMBER>2a5d5c libflutter.so operator() (../../flutter/shell/common/rasterizer.cc:165) [arm64-v8a]
13 #12 pc<PHONE_NUMBER>2a56c4 libflutter.so flutter::Rasterizer::Draw(fml::RefPtr<flutter::Pipeline<flutter::LayerTree> >) (../../third_party/libcxx/include/functional:1860) [arm64-v8a]
14 #13 pc<PHONE_NUMBER>2aad38 libflutter.so operator() (../../third_party/libcxx/include/functional:1707) [arm64-v8a]
15 #14 pc<PHONE_NUMBER>27d698 libflutter.so fml::MessageLoopImpl::RunExpiredTasksNow() (../../third_party/libcxx/include/functional:2419) [arm64-v8a]
16 #15 pc<PHONE_NUMBER>28105c libflutter.so __invoke (../../flutter/fml/platform/android/message_loop_android.cc:40 [Inline: operator()]) [arm64-v8a]
17 #16 pc<PHONE_NUMBER>0141c0 /system/lib64/libutils.so (android::Looper::pollInner(int)+856) [arm64-v8a]
18 #17 pc<PHONE_NUMBER>013dcc /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+60) [arm64-v8a]
19 #18 pc<PHONE_NUMBER>00f4d8 /system/lib64/libandroid.so (ALooper_pollOnce+96) [arm64-v8a]
20 #19 pc<PHONE_NUMBER>281178 libflutter.so fml::MessageLoopAndroid::Run() (../../flutter/fml/platform/android/message_loop_android.cc:68) [arm64-v8a]
21 #20 pc<PHONE_NUMBER>27d4ac libflutter.so Run (../../flutter/fml/message_loop_impl.cc:0) [arm64-v8a]
22 #21 pc<PHONE_NUMBER>27fd5c libflutter.so __thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, (lambda at ../../flutter/fml/thread.cc:28:43)> > (../../third_party/libcxx/include/thread:351 [Inline: __thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, (lambda at ../../flutter/fml/thread.cc:28:43)>]) [arm64-v8a]
23 #22 pc<PHONE_NUMBER>083840 /system/lib64/libc.so (__pthread_start(void*)+36) [arm64-v8a]
24 #23 pc<PHONE_NUMBER>023d80 /system/lib64/libc.so (__start_thread+68) [arm64-v8a]

Without additional information, we are unfortunately not sure how to resolve this issue. We are therefore reluctantly going to close this bug for now. Please don't hesitate to comment on the bug if you have any more information for us; we will reopen it right away!
Thanks for your contribution.
Could everyone who still has this problem please file a new issue with the exact descriptions what happens, logs and the output of 'flutter doctor -v'  please.
All system setups can be slightly different so it's always better to open new issues and reference related issues.


EPL multiple combination of copyright owners

Hello
I'm a Eclipse Che developer and I have one question related to license check
EPL looks like this.
/*******************************************************************************
 * Copyright (c) {DATE} {INITIAL COPYRIGHT OWNER} {OTHER COPYRIGHT OWNERS}.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    {INITIAL AUTHOR} - initial API and implementation and/or initial documentation
 *    {Second AUTHOR} - Dev API
 *******************************************************************************/

Until some time we have one or two copyright owners.
I've managed this with different templates and with configuration of individual maven
modules. In the case if one module contains several owners we just exclude files
with different owners. Now situation become complex.
So I need to have ability to correctly manage several combination of owners in single module
Ideally without plugin configuration change.
Any ideas how to achieve that.

** bump **

Well, I have not tried yet, but I think you can achieve this declaring the properties configuration and set all the owners in a pom properties:
<properties>
    <owner>${license.copyrightOwners}</owner>
</properties>

It works if one module contains sources with a single list of  license.copyrightOwners. My problem and the goal of this issue to solve situation if single module contains different sources with different combination of copyrightOwners

Do you have found any solution?

@skabashnyuk : how could the plugin determine per file which authors to put in a header ?
The request is nice but I don't see how it could be easily implemented without providing some mapping somewhere...
If such use cases are limited in your code-base, you can exclude the files from license maven plugin and manage the headers yourself perhaps ?

how could the plugin determine per file which authors to put in a header ?

In our case https://github.com/eclipse/che. One of the trickiest situations was if
there is a jar that contains a lot of files and majority of the classes have one set of authors
however ~10-20 has two or three others. Having individual configuration will look complex.
Putting all that files to ignore(what we are doing right now) has some disadvantiages - like skiping
license check in future,  not automatically update of years.
I would say this task should be separate on two distinct topics.

How to generate a new header.
For this case, we may reuse the current approach.
How to check existed header.
I would say we should be able to explain in the template that some additional characters may happen here and license
the plugin should not fail if it saw something.

the first thing that comes to mind something like this:
Copyright (c) ${license.git.copyrightYears} ${h_copyrightOwner}*
This program and the accompanying materials are made
available under the terms of the Eclipse Public License 2.0
which is available at https://www.eclipse.org/legal/epl-2.0/

SPDX-License-Identifier: EPL-2.0

Contributors:
  ${h_contributor}*


All: Include examples in all documentation

thanos, version 0.1.0 (branch: HEAD, revision: 301925295dc9b2fd82942cd4165cf19ad8fe55e5)
build user:       jenkins@build
build date:       20181021-04:24:29
go version:       go1.10.3
What happened
Thanos help should display examples for each option.  For instance:
--alert.query-url=ALERT.QUERY-URL    The external Thanos Query URL that would be set in all alerts 'Source' field
What format should the URL be in? Should it accept http:// or just be alert.foo.bar
--query=<query> ...        Addresses of statically configured query API servers (repeatable).
Should that be a full ip and port? Just an IP?
The documentation is inconsistent in documenting usable examples.

Valid issue.


Rejecting METHOD_NOT_AVAILABLE error as an Error object

instead of a simple object.
Gives access to Error attributes that might be expected by error catchers in project integrating this lib,
especially the stack trace

Awesome! Published as 1.1.0


Add fluent-bit 2.0 compatible parser

Now, fluent-bit 2.0.4 starts to send cmetrics/ctraces payload as Fluentd's Log format.


tests: Bun fails to overwrite project files if CLI is executed with absolute path

Node, and Bun (if the CLI is executed with relative paths), will happily overwrite files in the target directory -- but if you run the CLI with absolute paths (as the tests do), Bun sometimes (maybe depending on minor/patch version?) fails to overwrite the files with an error that the file already exists.
This has causes sporadic failures in CI, and particularly on my Linux machine I am unable to run the tests generally.
A possible fix is here to make the behavior the same as Node by using relative paths, once other test fixes are merged I will submit a PR.

@frankcalise has mentioned on Discord this issue, and while I do agree that we shouldn't silently overwrite files, I also think the tests should run as node and node's fs module would run. A test and/or a separate fix for the better UX around not overwriting files should also happen.


test: fix flaky stickyness test

Preview environments are getting posted here, as soon as they are ready!


Update man page with new commands

Here's the man page updates for the two new commands

Please update the date as well