Commit Graph

279 Commits

Author SHA1 Message Date
Jon Skeet bdcfa830f0 Remove params-oriented methods in specific formatters
We don't expect users to use CloudEventFormatter directly anyway, so
convenience methods aren't really important. If we later decide we
want them, we can put them in the base class instead.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-18 07:38:50 +00:00
Jon Skeet 52437b3d50 Rename ICloudEventFormatter to CloudEventFormatter
While this could be CloudEventFormatterBase, it's probably clearer
as it is.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-18 07:38:50 +00:00
Jon Skeet c3495d0a55 Change ICloudEventFormatter into an abstract class
Obviously the name is then inappropriate, but that will be changed in a subsequent commit.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-18 07:38:50 +00:00
Jon Skeet 8b63348296 feat: Extract the existing JSON event formatter from the main SDK
This allows us to remove the Newtonsoft.Json dependency from the
SDK, and implement another event formatter based on System.Text.Json
later on. That should probably wait until we've iterated on the
design of event formatters though.

This commit moves us closer towards (but doesn't fix) #42.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-13 06:42:43 +00:00
Jon Skeet ab2a9b6448 Comment-only review changes
Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-11 07:57:38 +00:00
Jon Skeet 33552a13f6 Address review comments
Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-11 07:57:38 +00:00
Jon Skeet 7d01a4a181 Fix URI parsing on Linux
This still leaves a hole where the user created a Uri instance
manually on Linux and it claims to be absolute, but it would
potentially be confusing to spot this in Validate as well...

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-11 07:57:38 +00:00
Jon Skeet 78dd8416b0 Add tests, primarily for CloudEvent, CloudEventAttribute and CloudEventAttributeType
Each of these classes has 100% coverage just by running their own tests.
There are still some areas of concern:

- .NET's URI parsing and formatting seems hard to predict, so we're not validating as much as I'd like
- There are some interesting questions about CloudEvent behavior which are tested in a "QuestionableBehavior" nested class in CloudEventTest

There's a fair amount of production code changing in here as well, primarily around validation.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-11 07:57:38 +00:00
Jon Skeet 70b5ae99fd Overhaul of codebase with new approach to attributes
This touches almost file in the repository, because it's hard not to
with such a fundamental change.

There are *lots* of TODOs now, all of which we should chase down
before release. In most cases this isn't a new problem - it's just
one that wasn't noted before,

The two main changes are:

- Spec versions, attributes, and attributes types are now first-class
  types. Rather than being able to set attributes to any value you
  want, values have to be of the right type and have a valid value
  (e.g. for datacontenttype). This centralizes value conversion
  for the most part (although transport/format-specific conversions
  may still be required) and makes everything more predictable.
- Extensions are now *not* first-class types; instead, the extension
  attributes can be registered with the CloudEvent in order to perform
  appropriate validation etc, and a pattern around extensions
  providing extension methods on CloudEvent allows them to be used
  easily.

This work has revealed a lot of smaller problems, such as the HTTP
transports propagating a content of "null" (rather than no content)
when no data was set in the CloudEvent. More testing is certainly
required.

It's worth noting that this is a really big breaking change. The 2.0
release was already going to be breaking, but this is much larger
than the previous changes. I assert that the benefits outweight the
costs though, and even though the package already has many users,
we hope there will be many times more users in the future.

Proposed process for this PR:

- This initial commit does not include nearly as many unit tests for
  CloudEvent, CloudEventAttribute or CloudEventAttributeType as I'd
  like. Those will come in a follow-up commit (which should be
  reviewed before merging) but don't affect the review of the overall
  ideas.
- If the general thrust of this PR is acceptable, then I propose we
  merge it, only making changes to the most egregious problems, and
  leaving further clean-up work (of which there's likely to be a lot)
  to later PRs. It's easier to create a clean-up PR in Visual Studio
  than to suggest fixes via GitHub.

Style changes:

- Use explicit access modifiers
- Move using directives before the namespace declaration
- Unit tests are generally more separated out to correspond to
  production classes, and are in separate directories/namespaces
  by project instead of all at the top level.

Currently StyleCop is not installed, but we should probably either
do that or use regular Roslyn analyzers in the long term - along
with turning on XML documentation generation.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-02-11 07:57:38 +00:00
Jon Skeet 87e15241de Make the spec version of an event immutable
This commit includes two WithSpecVersion methods, one in CloudEvent
and the other in CloudEventAttributes, which convert from one
version to another. These are currently internal, but we can expose
them later if we wish.

Fixes #65
Fixes #66

Creating this commit has raised more issues to discuss:

- CloudEventSpecVersion.Default is a public enum value; changing that
  later would be a breaking change in difficult-to-document ways.
- In general, CloudEventSpecVersion feels like it deserves to be a
  class with well-known specific instances, rather than an enum. That
  would make various things much simpler.
- Given that attributes other than data have a limited set of types,
  I suspect it's worth having a CloudEventAttribute type encapsulating
  that.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-28 18:25:22 +00:00
Jon Skeet d234dfc4de Use DateTimeOffset for timestamp attributes
Also, format those timestamps using the Timestamps class introduced previously.

Fixes #61
Fixes #57
Fixes #48

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-27 07:17:58 +00:00
Jon Skeet d5310c94d0 Isolated helper code for timestamp parsing/formatting
(This is a separate commit for easier review)

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-27 07:17:58 +00:00
JoshLove-msft 9c52e6c85e Fix typo in resource string
Signed-off-by: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com>
2021-01-22 06:46:02 +00:00
Jon Skeet 7debdc1513 Update netcoreapp3.0 targets to netcoreapp3.1
(3.1 is the LTS release; 3.0 is out of support now.)

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-15 17:34:42 +00:00
Jon Skeet aac7267a51 Don't push to NuGet from AppVeyor
We can potentially turn the AppVeyor integration down entirely later
on, but at least for now let's make sure packages are pushed manually.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-15 17:34:06 +00:00
Jon Skeet 5471d972f2 Revert to requiring a content type for binary mode
We now provide a more explicit check.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-12 10:00:29 +00:00
Jon Skeet 25a719e48a Address review comments for HTTP header mapping
CloudEventContent now *does* map attributes to HTTP headers in
structured mode, including datacontenttype.

This commit also fixes the format of date/time values to be RFC-3339
compliant.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-12 10:00:29 +00:00
Jon Skeet 3301cbf879 Fix CloudEventContent's handling of headers
- For structured mode, we shouldn't map attributes to HTTP headers
- For binary mode, we should default the media content type to application/json
- UrlEncode and UrlDecode headers in binary mode
- Adds more testing of headers

Fixes #67 and #69.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-12 10:00:29 +00:00
Jon Skeet 4aa5a481e3 Prevent the spec version attribute from being removed via Remove calls
Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-12 08:55:20 +00:00
Jon Skeet c95871b782 Preserve the spec version attribute when clearing CloudEventAttributes
Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-12 08:55:20 +00:00
Jon Skeet 0441d93593 Prevent null values being added to CloudEventAttributes via the Add methods
Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-12 08:55:20 +00:00
Jon Skeet acafac096d Allow every attribute other than the spec version to be cleared
Fixes #58

Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-12 08:55:20 +00:00
Jon Skeet e836d6ce90 Sign test/sample assemblies, and make internals visible to unit tests
Signed-off-by: Jon Skeet <jonskeet@google.com>
2021-01-12 08:55:20 +00:00
Jon Skeet b494765587 Update the release trigger to install .NET Core 2.1
(This is so we can run the tests against netcoreapp2.1.)

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-11-11 18:49:32 +00:00
Jon Skeet 3f2308edf6 Use a centralized version number during beta
See PROCESSES.md for the reasoning

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-11-11 07:38:08 +00:00
Jon Skeet 4e98c5a52b Make all sample and test project non-packable
It's simpler and more reliable to do this with Directory.Build.props files than in individual project files.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-11-11 07:38:08 +00:00
Jon Skeet 50b714cd59 First draft of a release process document
Note that it refers to version history documents - but doesn't
specify where those are. That's up for discussion - I've filed #76
for that.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-11-11 07:38:08 +00:00
Jon Skeet 426580248c Add a GitHub action to push NuGet packages when a release is created
This commit won't actually push anything - but it will allow
us to test things before we *do* manually create a release.

Once testing is completed, we'll want to use a (suitably encrypted)
NuGet API key to push to NuGet.

Note that this initially assumes we want to release all packages at
the same time. We'll want to change it when we reach GA for 2.0.0.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-11-11 07:38:08 +00:00
Jon Skeet cb5df1ea71 Add a first GitHub action to build PRs and the main branch
(We can add a badge later, and potentially remove the AppVeyor build
if we want.)

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-11-11 07:38:08 +00:00
Clemens Vasters c245449647
Merge pull request #73 from duglin/coc
add coc ref
2020-09-22 09:16:06 +02:00
Doug Davis 2c1eba2f62 add coc ref
Signed-off-by: Doug Davis <dug@us.ibm.com>
2020-08-11 14:33:34 +00:00
Jon Skeet aea34a4f5c Make test and samples directories handle DeterministicSourcePaths
(This is important for CI and release builds.)

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-07-14 19:05:46 +01:00
Jon Skeet e39d213926 Allow PDB files in the NuGet package
Although PDB files are discouraged in some cases, there's a trade-off between package size and having to use a separate symbol package.
In our case, the packages are very small, and the PDBs only contribute a small amount of that size anyway.

Fixes #53 (verified)

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-07-14 19:05:46 +01:00
Jon Skeet d961c5cafd Include the license file in the package
Part of #54.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-07-14 19:05:46 +01:00
Jon Skeet 48d697abad Add strong naming for all projects
The snk file was generated using this command:

sn -k CloudEventsSdk.snk

Note that this is a breaking change. (Other changes have already
been breaking, but this is *very* breaking.)

Fixes #24.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-07-14 19:05:46 +01:00
Clemens Vasters c50fd95c50
Merge pull request #52 from jskeet/internals
Remove InternalsVisibleTo access for non-test projects
2020-06-25 14:01:34 +02:00
Doug Davis 90557dd19e add link to email
Signed-off-by: Doug Davis <dug@us.ibm.com>
2020-06-17 17:02:59 +01:00
Jon Skeet d08756490e Remove internal access to CloudEvents from other projects
InternalsVisibleTo can be very difficult to use correctly between production packages - it's easy to forget that an "internal" member can't take any breaking changes due to other packages that depend on it.
It's reasonable to use InternalsVisibleTo for test packages though.

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-06-16 15:41:32 +01:00
Jon Skeet 359cad9397 Make CloudEvent.Extensions public, but as a read-only dictionary
(This isn't necessarily what we want long-term, but it allows the next commit.)

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-06-16 15:41:16 +01:00
Clemens Vasters bf18018fc5
Merge pull request #51 from jskeet/fix-warnings
Fix warnings, then make sure we treat warnings as errors
2020-06-15 16:30:20 +02:00
Jon Skeet 0acb17529a Move common MSBuild properties into Directory.Build.props/Directory.Build.targets
This makes it easier to stay consistent across projects

New properties/targets added:

- Treat warnings as errors
- Use SourceLink for all production projects, via the Microsoft.SourceLink.GitHub package
- Explicitly state that the build should be deterministic

Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-06-05 11:06:38 +01:00
Jon Skeet b2c918ee0c Fix warnings around async methods/lambda expressions
Signed-off-by: Jon Skeet <jonskeet@google.com>
2020-06-05 11:06:15 +01:00
Doug Davis b0f3c06a5f
Merge pull request #41 from duglin/editreadme
add helpful text to README
2020-03-20 10:17:26 -04:00
Doug Davis fb6a2fbb20 add helpful text to README
Signed-off-by: Doug Davis <dug@us.ibm.com>
2020-01-28 18:45:06 +00:00
clemensv 7ee2a4d5dd update NuGet API key
Signed-off-by: clemensv <clemensv@microsoft.com>
2020-01-16 10:04:29 +01:00
clemensv 67147eceb2 update version
Signed-off-by: clemensv <clemensv@microsoft.com>
2020-01-16 09:31:28 +01:00
Clemens Vasters 266fdf692f
Merge pull request #40 from clemensv/avro
Adding support for Avro encoding.
2020-01-15 16:59:01 +01:00
clemensv 8ed5dcfee4 Adding support for Avro encoding.
Signed-off-by: clemensv <clemensv@microsoft.com>
2020-01-15 16:31:33 +01:00
clemensv 91ff29512b Documentation fixes
Signed-off-by: clemensv <clemensv@microsoft.com>
2020-01-15 11:12:03 +01:00
Clemens Vasters 0959b118e2
Merge pull request #39 from TobbenTM/fix-http-header-value-mapping
Now URL-encoding and decoding header values
2020-01-15 10:03:14 +01:00