{"id":28781056,"url":"https://github.com/workday/postman","last_synced_at":"2025-10-06T16:45:08.119Z","repository":{"id":57729738,"uuid":"36572522","full_name":"Workday/postman","owner":"Workday","description":"A library that implements Parcelable for you.","archived":false,"fork":false,"pushed_at":"2023-04-08T07:29:37.000Z","size":161,"stargazers_count":64,"open_issues_count":3,"forks_count":15,"subscribers_count":23,"default_branch":"master","last_synced_at":"2025-06-17T18:52:03.436Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Workday.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-30T19:28:49.000Z","updated_at":"2025-03-12T13:48:50.000Z","dependencies_parsed_at":"2022-09-10T21:51:28.986Z","dependency_job_id":null,"html_url":"https://github.com/Workday/postman","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/Workday/postman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fpostman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fpostman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fpostman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fpostman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Workday","download_url":"https://codeload.github.com/Workday/postman/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Workday%2Fpostman/sbom","scorecard":{"id":152217,"data":{"date":"2025-08-11","repo":{"name":"github.com/Workday/postman","commit":"f8827e916d17ffe0834834d290cdf4f8bf0e96de"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Code-Review","score":2,"reason":"Found 4/16 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.3 not signed: https://api.github.com/repos/Workday/postman/releases/2456049","Warn: release artifact v1.2 not signed: https://api.github.com/repos/Workday/postman/releases/1950281","Warn: release artifact v1.1 not signed: https://api.github.com/repos/Workday/postman/releases/1727126","Warn: release artifact v1.0 not signed: https://api.github.com/repos/Workday/postman/releases/1629858","Warn: release artifact v0.9 not signed: https://api.github.com/repos/Workday/postman/releases/1592826","Warn: release artifact v1.3 does not have provenance: https://api.github.com/repos/Workday/postman/releases/2456049","Warn: release artifact v1.2 does not have provenance: https://api.github.com/repos/Workday/postman/releases/1950281","Warn: release artifact v1.1 does not have provenance: https://api.github.com/repos/Workday/postman/releases/1727126","Warn: release artifact v1.0 does not have provenance: https://api.github.com/repos/Workday/postman/releases/1629858","Warn: release artifact v0.9 does not have provenance: https://api.github.com/repos/Workday/postman/releases/1592826"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 22 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T11:00:03.875Z","repository_id":57729738,"created_at":"2025-08-16T11:00:03.875Z","updated_at":"2025-08-16T11:00:03.875Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278646729,"owners_count":26021511,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-17T18:39:47.657Z","updated_at":"2025-10-06T16:45:08.113Z","avatar_url":"https://github.com/Workday.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# postman\n\nPostman is a java library that uses code generation to handle the details of implementing the [Parcelable](http://developer.android.com/reference/android/os/Parcelable.html) interface on Android.\n\n__Latest Version:__ [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.workday/postman/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.workday/postman)\n\n__Build Status:__ [![Build Status](https://travis-ci.org/Workday/postman.svg?branch=master)](https://travis-ci.org/Workday/postman)\n\n## The Problem\n\nPostman is intended to be used in cases where you have parcelable classes with a lot of fields that need to be serialized. At Workday, we had a lot of classes like the following to represent the responses from server.\n\n```java\npublic class MyParcelable implements Parcelable {\n\n    int myInt;\n    String myString;\n    MyChildParcelable myChildParcelable;\n    ArrayList\u003cMyChildParcelable\u003e myParcelableList;\n    ArrayList\u003cString\u003e myStringList;\n\n    public static final Creator\u003cMyParcelable\u003e CREATOR = new Creator\u003cMyParcelable\u003e() {\n\n        @Override\n        public MyParcelable createFromParcel(Parcel source) {\n            MyParcelable myParcelable = new MyParcelable();\n            Bundle bundle = source.readBundle();\n            myParcelable.myInt = bundle.getInt(\"myInt\");\n            myParcelable.myString = bundle.getString(\"myString\");\n            myParcelable.myChildParcelable = bundle.getParcelable(\"myChildData\");\n            myParcelable.myParcelableList = bundle.getParcelableArrayList(\"myParcelableList\");\n            myParcelable.myStringList = bundle.getStringArrayList(\"myStringList\");\n            return myParcelable;\n        }\n\n        @Override\n        public MyParcelable[] newArray(int size) {\n            return new MyParcelable[size];\n        }\n    };\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        Bundle bundle = new Bundle();\n        bundle.putInt(\"myInt\", myInt);\n        bundle.putString(\"myString\", myString);\n        bundle.putParcelable(\"myChildData\", myChildParcelable);\n        bundle.putParcelableArrayList(\"myParcelableList\", myParcelableList);\n        bundle.putStringArrayList(\"myStringList\", myStringList);\n        dest.writeBundle(bundle);\n    }\n}\n```\n\nIf you have to write several classes like this, it gets very tedious and tiresome very quickly. And if you're like most software developers, you want to avoid tedious and tiresome like the plague.\n\n## The Solution\n\nThere is nothing fancy or unexpected in making a class parcelable. There is a lot of boiler plate and it all follows the same pattern. We could write a program that writes this code for us. So we did.\n\nWe wrote an annotation processor that can read through a class that you mark as a candidate for processing, and it will generate all the code in the `Creator` and in `writeToParcel(Parcel, int)`. The same class from above now becomes this:\n\n```java\n@Parceled\npublic class MyParcelable implements Parcelable {\n\n    int myInt;\n    String myString;\n    MyChildParcelable myChildParcelable;\n    ArrayList\u003cMyChildParcelable\u003e myParcelableList;\n    ArrayList\u003cString\u003e myStringList;\n\n    public static final Creator\u003cMyParcelable\u003e CREATOR = Postman.getCreator(MyParcelable.class);\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        Postman.writeToParcel(this, dest);\n    }\n}\n```\n\nThat's all you need to do get Postman working!\n\n## How to Use Postman\n\nAdd the following lines to your `build.gradle` file, replacing `$postman_version` with latest version from Maven Central.\n\n```gradle\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    compile \"com.workday:postman:$postman_version\"\n    compile \"com.workday:postman-processor:$postman_version\"\n}\n```\n\nNote that if you use the [android-apt plugin](https://bitbucket.org/hvisser/android-apt) or the [kotlin-android plugin](https://kotlinlang.org/docs/reference/using-gradle.html), you may use `apt` or `kapt` respectively instead of `compile` for `postman-processor`, e.g.\n\n```gradle\napt \"com.workday:postman-processor:$postman_version\"\n```\n\n### Postman Idioms\n\nThe previous example demonstrates the most common way you will use Postman: annotate the class in question with `@Parceled`. Postman will pick up all member fields in the class and write them to or read them from the Parcel when `Postman.writeToParcel(Object, Parcel)` or `Postman.readFromParcel(Class, Parcel)` is called.\n\nUnfortunately, there is still some boiler plate code you have to deal with. In your parcelable class, you must include the following lines:\n\n```java\npublic static final Creator\u003cMyParcelable\u003e CREATOR = Postman.getCreator(MyParcelable.class);\n\n@Override\npublic int describeContents() {\n  return 0;\n}\n\n@Override\npublic void writeToParcel(Parcel dest, int flags) {\n  Postman.writeToParcel(this, dest);\n}\n```\n\nreplacing MyParcelable with your own class name. We hope you agree though that this is much less painful than writing the full implementations yourself.\n\nHowever, to make this part easier, we have included a [live template](https://www.jetbrains.com/idea/help/live-templates.html) that you can use in Android Studio. Include [AndroidParcelable.xml](./AndroidParcelable.xml) in the following directory depending on your operating system.\n\n- Windows: `\u003cyour home directory\u003e\\.AndroidStudio\u003cversion number\u003e\\config\\templates`\n- Linux: `~/.AndroidStudio\u003cversion number\u003e/config/templates`\n- OS X: `~/Library/Preferences/AndroidStudio\u003cversion number\u003e/templates`\n\nRestart Android Studio. Then in your Parcelable class, type `postman` on an empty line and hit enter. Android Studio will write the block for you (sans imports).\n\n#### What if there's a field I don't want to include in the Parcel?\n\nIn that case, annotate the offending field with `@NotParceled`.\n\n#### What if I don't want to include most of the fields in the Parcel?\n\nNo problem. In that case, instead of annotating the class with `@Parceled`, annotate the fields you want included with `@Parceled`. All other fields will be ignored.\n\n### Things to Watch Out For\n\n* Postman cannot access private fields. Any field you want to include in the Parcel must be either package-private (aka default) or public. If you annotate a private field with `@Parceled`, Postman will generate a compilation error. A private field in a class annotated with `@Parceled` will generate a compiler warning.\n* Postman cannot populate final fields. If you annotate a final field with `@Parceled`, Postman will generate a compilation error. A final field in a class annotated with `@Parceled` will generate a compiler warning.\n* Postman requires a public or package-private, no arg constructor in order to instantiate the class. A class marked with `@Parceled` that does not have default constructor will generate a compilation error.\n\n### Types Postman Can Handle\n\nPostman can write to the Parcel any of the following types.\n\n* All primitives (e.g. `int`, `boolean`) as well as their boxed counterparts (e.g. [Integer](http://developer.android.com/reference/java/lang/Integer.html), [Boolean](http://developer.android.com/reference/java/lang/Boolean.html)).\n* [BigDecimal](http://developer.android.com/reference/java/math/BigDecimal.html) and [BigInteger](http://developer.android.com/reference/java/math/BigInteger.html)\n* Any class that implements Parcelable.\n* String and [CharSequence](http://developer.android.com/reference/java/lang/CharSequence.html)\n* Any class that implements [Serializable](http://developer.android.com/reference/java/io/Serializable.html)\n* The following Collections, so long as they only contain items enumerated in this list (this includes `List\u003cList\u003cString\u003e\u003e`)\n    * [ArrayList](http://developer.android.com/reference/java/util/ArrayList.html), [LinkedList](http://developer.android.com/reference/java/util/LinkedList.html)\n    * [HashSet](http://developer.android.com/reference/java/util/HashSet.html), [LinkedHashSet](http://developer.android.com/reference/java/util/LinkedHashSet.html), [TreeSet](http://developer.android.com/reference/java/util/TreeSet.html)\n* The following Maps so long as they only contain keys and values enumerated in this list (this include `Map\u003cString, List\u003cString\u003e\u003e`)\n    * [HashMap](http://developer.android.com/reference/java/util/HashMap.html), [LinkedHashMap](http://developer.android.com/reference/java/util/LinkedHashMap.html)\n\nNote that Postman will compile if it encounters a `List\u003cObject\u003e` or a `Map\u003cString, Object\u003e`, but if one of the items is not of a type that Postman can handle, it will throw a runtime exception when it tries to write the object to the parcel.\n\n### Working with Proguard\n\nIf you're using [ProGuard](http://proguard.sourceforge.net/), you must add the following line to your ProGuard rules\n\n```\n-keep class * implements com.workday.postman.parceler.Parceler\n-dontwarn com.workday.postman.codegen.*\n```\n\notherwise your app will blow up.\n\nPostman also doesn't work with obfuscation, so you if you have obfuscation turned on, you'll need to keep all of your parceled classes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkday%2Fpostman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fworkday%2Fpostman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fworkday%2Fpostman/lists"}