Giter Site home page Giter Site logo

mikepenz / aboutlibraries Goto Github PK

View Code? Open in Web Editor NEW
3.5K 127.0 412.0 12.03 MB

AboutLibraries automatically collects all dependencies and licenses of any gradle project (Kotlin MultiPlatform), and provides easy to integrate UI components for Android and Compose-jb environments

Home Page: http://blog.mikepenz.dev

License: Apache License 2.0

CSS 1.86% HTML 1.53% JavaScript 2.42% Python 0.27% Ruby 0.36% Kotlin 93.52% Shell 0.05%
aboutlibraries mikepenz fragments android libraries android-library android-ui android-development hacktoberfest compose

aboutlibraries's Introduction

AboutLibraries

.. collects all dependency details including licenses at compile time, and offers simple APIs to visualize these in the app. No runtime overhead. Strong caching. Any gradle dependency is supported.


What's included ๐Ÿš€ โ€ข Setup ๐Ÿ› ๏ธ โ€ข Gradle API๏ธ โ€ข SDK Docs ๐Ÿ“– โ€ข Plugin Docs ๐Ÿ“– โ€ข Migration Guide ๐Ÿงฌ โ€ข Sample App


What's included ๐Ÿš€

  • Kotlin Multiplatform support (including wasm)
  • Lightweight multiplatform core module
    • Access all generated information
    • Build custom UIs
  • Compose UI module
  • Gradle Plugin
    • Generating dependency / license metadata
    • Different exports, compliance report
    • Identify possible project funding
    • License strict mode
  • Simple and fast integration

Screenshots

Screenshots

Setup

Latest releases ๐Ÿ› 

  • Kotlin && Multiplatform && Compose && Plugin | v11.1.3

Gradle Plugin

AboutLibraries v10 includes a completely redone plugin, with build cache support. It includes all dependencies as found based on the gradle configuration.

The gradle plugin is hosted via Gradle Plugins.

Using the plugins DSL (for single modules)

// Root build.gradle
id 'com.mikepenz.aboutlibraries.plugin' version "${latestAboutLibsRelease}" apply false

// App build.gradle
id 'com.mikepenz.aboutlibraries.plugin'

Using the plugins DSL (for whole project)

// Root build.gradle
id 'com.mikepenz.aboutlibraries.plugin' version "${latestAboutLibsRelease}"

Using legacy plugin application

// Root build.gradle
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}"

// App build.gradle
apply plugin: 'com.mikepenz.aboutlibraries.plugin'

Gradle Plugin Configuration

Gradle Plugin Configuration

It is possible to provide custom configurations / adjustments to the automatic detection. This can be done via the gradle plugin.

aboutLibraries {
    // - If the automatic registered android tasks are disabled, a similar thing can be achieved manually
    // - `./gradlew app:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/res/raw`
    // - the resulting file can for example be added as part of the SCM
    registerAndroidTasks = false
    // Define the output file name. Modifying this will disable the automatic meta data discovery for supported platforms.
    outputFileName = "aboutlibraries.json"
    // Define the path configuration files are located in. E.g. additional libraries, licenses to add to the target .json
    // Warning: Please do not use the parent folder of a module as path, as this can result in issues. More details: https://github.com/mikepenz/AboutLibraries/issues/936
    configPath = "config"
    // Allow to enable "offline mode", will disable any network check of the plugin (including [fetchRemoteLicense] or pulling spdx license texts)
    offlineMode = false
    // Enable fetching of "remote" licenses.  Uses the API of supported source hosts
    // See https://github.com/mikepenz/AboutLibraries#special-repository-support
    fetchRemoteLicense = true
    // Enables fetching of "remote" funding information. Uses the API of supported source hosts
    // See https://github.com/mikepenz/AboutLibraries#special-repository-support
    fetchRemoteFunding = true
    // (Optional) GitHub token to raise API request limit to allow fetching more licenses
    gitHubApiToken = getLocalOrGlobalProperty("github.pat")
    // Full license text for license IDs mentioned here will be included, even if no detected dependency uses them.
    additionalLicenses = ["mit", "mpl_2_0"]
    // Allows to exclude some fields from the generated meta data field.
    excludeFields = ["developers", "funding"]
    // Enable inclusion of `platform` dependencies in the library report
    includePlatform = true
    // Define the strict mode, will fail if the project uses licenses not allowed
    // - This will only automatically fail for Android projects which have `registerAndroidTasks` enabled
    // For non Android projects, execute `exportLibraryDefinitions`
    strictMode = com.mikepenz.aboutlibraries.plugin.StrictMode.FAIL
    // Allowed set of licenses, this project will be able to use without build failure
    allowedLicenses = ["Apache-2.0", "asdkl"]
    // Enable the duplication mode, allows to merge, or link dependencies which relate
    duplicationMode = com.mikepenz.aboutlibraries.plugin.DuplicateMode.LINK
    // Configure the duplication rule, to match "duplicates" with
    duplicationRule = com.mikepenz.aboutlibraries.plugin.DuplicateRule.SIMPLE
    // Enable pretty printing for the generated JSON file
    prettyPrint = false
    // Allows to only collect dependencies of specific variants during the `collectDependencies` step.
    filterVariants = ["debug", "release"]
}

Full documentation of all available gradle plugin configurations: https://github.com/mikepenz/AboutLibraries/blob/develop/plugin-build/plugin/src/main/kotlin/com/mikepenz/aboutlibraries/plugin/AboutLibrariesExtension.kt

Modify libraries / licenses

The plugin offers the ability to add additional libraries or licenses by specifying these under the libraries and respectively licenses directory, within the defined configPath. This can be seen here: https://github.com/mikepenz/AboutLibraries/blob/develop/config/

Libraries

Provide additional or modify existing libraries via a .json file per library. If the uniqueId overlaps, a merge will occur.

{
  "uniqueId": "com.mikepenz:materialdrawer",
  "developers": [
    {
      "name": "Mike Penz",
      "organisationUrl": "https://mikepenz.dev"
    }
  ],
  "description": "(Merged) The flexible, easy to use, all in one drawer library for your Android project.",
  "name": "ABC MaterialDrawer Library",
  "website": "https://github.com/mikepenz/MaterialDrawer"
}

Licenses

Provide additional or modify existing licenses via a .json file per license.

{
  "content": "This is the Android Software Development Kit License Agreement\n<br />\n1. Introduction\n<br />\n1.1 The Android Software Development Kit (referred to in the License Agreement as the \"SDK\" and specifically including the Android system files, packaged APIs, and Google APIs add-ons) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK.\n<br />\n1.2 \"Android\" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time.\n<br />\n1.3 A \"compatible implementation\" means any Android device that (i) complies with the Android Compatibility Definition document, which can be found at the Android compatibility website (http://source.android.com/compatibility) and which may be updated from time to time; and (ii) successfully passes the Android Compatibility Test Suite (CTS).\n<br />\n1.4 \"Google\" means Google LLC, a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.\n<br />\n2. Accepting this License Agreement\n<br />\n2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement.\n<br />\n2.2 By clicking to accept, you hereby agree to the terms of the License Agreement.\n<br />\n2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries, including the country in which you are resident or from which you use the SDK.\n<br />\n2.4 If you are agreeing to be bound by the License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.\n<br />\n3. SDK License from Google\n<br />\n3.1 Subject to the terms of the License Agreement, Google grants you a limited, worldwide, royalty-free, non-assignable, non-exclusive, and non-sublicensable license to use the SDK solely to develop applications for compatible implementations of Android.\n<br />\n3.2 You may not use this SDK to develop applications for other platforms (including non-compatible implementations of Android) or to develop another SDK. You are of course free to develop applications for other platforms, including non-compatible implementations of Android, provided that this SDK is not used for that purpose.\n<br />\n3.3 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. \"Intellectual Property Rights\" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you.\n<br />\n3.4 You may not use the SDK for any purpose not expressly permitted by the License Agreement.  Except to the extent required by applicable third party licenses, you may not copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK.\n<br />\n3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement.\n<br />\n3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you.\n<br />\n3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features.\n<br />\n3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.\n<br />\n4. Use of the SDK by You\n<br />\n4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications.\n<br />\n4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries).\n<br />\n4.3 You agree that if you use the SDK to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so.\n<br />\n4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google or any mobile communications carrier.\n<br />\n4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so.\n<br />\n4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.\n<br />\n5. Your Developer Credentials\n<br />\n5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.\n<br />\n6. Privacy and Information\n<br />\n6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected.\n<br />\n6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy.\n<br />\n7. Third Party Applications\n<br />\n7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources.\n<br />\n7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners.\n<br />\n7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, the License Agreement does not affect your legal relationship with these third parties.\n<br />\n8. Using Android APIs\n<br />\n8.1 Google Data APIs\n<br />\n8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service.\n<br />\n8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so. If you use the Android Recognition Service API, documented at the following URL: https://developer.android.com/reference/android/speech/RecognitionService, as updated from time to time, you acknowledge that the use of the API is subject to the Data Processing Addendum for Products where Google is a Data Processor, which is located at the following URL: https://privacy.google.com/businesses/gdprprocessorterms/, as updated from time to time. By clicking to accept, you hereby agree to the terms of the Data Processing Addendum for Products where Google is a Data Processor.\n<br />\n9. Terminating this License Agreement\n<br />\n9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below.\n<br />\n9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials.\n<br />\n9.3 Google may at any time, terminate the License Agreement with you if:<br />\n(A) you have breached any provision of the License Agreement; or<br />\n(B) Google is required to do so by law; or<br />\n(C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the SDK to you; or<br />\n(D) Google decides to no longer provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service, or the provision of the SDK or certain SDK services to you by Google is, in Google's sole discretion, no longer commercially viable.<br />\n<br />\n9.4 When the License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely.\n<br />\n10. DISCLAIMER OF WARRANTIES\n<br />\n10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED \"AS IS\" AND \"AS AVAILABLE\" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE.\n<br />\n10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE.\n<br />\n10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\n<br />\n11. LIMITATION OF LIABILITY\n<br />\n11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.\n<br />\n12. Indemnification\n<br />\n12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with the License Agreement.\n<br />\n13. Changes to the License Agreement\n<br />\n13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.\n<br />\n14. General Legal Terms\n<br />\n14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK.\n<br />\n14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google.\n<br />\n14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable.\n<br />\n14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement.\n<br />\n14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE.\n<br />\n14.6 The rights granted in the License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under the License Agreement without the prior written approval of the other party.\n<br />\n14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction.",
  "hash": "asdkl",
  "url": "https://developer.android.com/studio/terms.html",
  "name": "Android Software Development Kit License Agreement"
}

Core-module

The AboutLibraries Library is pushed to Maven Central.

implementation "com.mikepenz:aboutlibraries-core:${latestAboutLibsRelease}"
(Advanced) Usage

Access generated library details

To create a individual integration, access the generated library information programmatically through the core module.

val libs = Libs.Builder()
    .withJson(aboutLibsJson) // provide the metaData (alternative APIs available)
    .build()
val libraries = libs.libraries // retrieve all libraries defined in the metadata
val licenses = libs.licenses // retrieve all licenses defined in the metadata
for (lib in libraries) {
    Log.i("AboutLibraries", "${lib.name}")
}

UI-module

implementation "com.mikepenz:aboutlibraries-compose:${latestAboutLibsRelease}"

// Alternative Material3 based module
implementation "com.mikepenz:aboutlibraries-compose-m3:${latestAboutLibsRelease}"

Usage

// android
LibrariesContainer(
    Modifier.fillMaxSize()
)

// compose-desktop
LibrariesContainer(useResource("aboutlibraries.json") {
    it.bufferedReader().readText()
}, Modifier.fillMaxSize())
Compose-jb

The core module and the compose module are Kotlin-Multiplatform projects. Find a sample application as the app-desktop module. It showcases the usage to manually generate the dependency meta information and include as part of the SCM.

Generate Dependency Information

./gradlew app-desktop:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/resources/

Run Desktop app

./gradlew :app-desktop:run

Screenshot

Compose-jb Screenshot

(Legacy) UI-module

implementation "com.mikepenz:aboutlibraries:${latestAboutLibsRelease}"
Usage

Usage

Use this library in a few different ways. Create a custom activity, including a custom style or just use its generated information. Or simply use the built-in Activity or Fragment and just pass the libs to include.

Note: The new version requires the new Material3 theme as base.

Activity

LibsBuilder()
    .start(this) // start the activity

The activity uses a toolbar, which requires the appropriate theme. See Style the AboutLibraries for more details

Fragment

val fragment = LibsBuilder()
    .supportFragment()

About this App UI

The AboutLibraries library also offers the ability to create an About this app screen. Add the following .xml file (or just the strings - the key must be the same) to the project.

<resources>
    <string name="aboutLibraries_description_showIcon">true</string>
    <string name="aboutLibraries_description_showVersion">true</string>
    <string name="aboutLibraries_description_text">Place the description here :D</string>
</resources>

or use the builder and add following:

.withAboutIconShown(true)
.withAboutVersionShown(true)
.withAboutDescription("This is a small sample which can be set in the about my app description file.<br /><b>Style this with html markup :D</b>")

Style the AboutLibraries ๐Ÿ–Œ๏ธ

Create a custom style for the AboutLibraries UI.

// define a custom style
<style name="CustomAboutLibrariesStyle" parent="">
    <!-- AboutLibraries specific values -->
    <item name="aboutLibrariesCardBackground">?cardBackgroundColor</item>
    <item name="aboutLibrariesDescriptionTitle">?android:textColorPrimary</item>
    <item name="aboutLibrariesDescriptionText">?android:textColorSecondary</item>
    <item name="aboutLibrariesDescriptionDivider">@color/opensource_divider</item>
    <item name="aboutLibrariesOpenSourceTitle">?android:textColorPrimary</item>
    <item name="aboutLibrariesOpenSourceText">?android:textColorSecondary</item>
    <item name="aboutLibrariesSpecialButtonText">?android:textColorPrimary</item>
    <item name="aboutLibrariesOpenSourceDivider">@color/opensource_divider</item>
</style>

// define the custom styles for the theme
<style name="SampleApp" parent="Theme.MaterialComponents.Light.NoActionBar">
    ...
    <item name="aboutLibrariesStyle">@style/CustomAboutLibrariesStyle</item>
    ...
</style>

Enterprise

Since v10 of the AboutLibraries plugin it is possible to disable the automatic registration of the plugin task as part of the build system.

aboutLibraries {
    registerAndroidTasks = false
}

This is especially beneficial for enterprise environments where it is required to be in full control of the included aboutlibraries.json. After disabling the integration it is possible to manually update the definitions, or do it on your CI environment.

./gradlew app:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/res/raw/ -PaboutLibraries.exportVariant=release

This generated file can be either included in your SCM, and every build will use this exact verified and approved state. Additionally, this helps to ensure no issues occur during the apps delivery phase, as the respective file is already generated and included.

The library offers complete customisation for this behavior and location or name for the generated files can be adjusted as needed. A full compose code example providing the Libs manually:

LibrariesContainer(
    librariesBlock = { ctx ->
        Libs.Builder().withJson(ctx, R.raw.aboutlibraries).build()
    }
)

Gradle API

By default, the gradle plugin is automatically executed for Android projects, generating the library metadata where it's automatically discovered by the ui modules. For other environments or for more advanced usages the plugin offers additional APIs.

# Manually generate the dependency metaData in the provided location. Allows to commit it in SCM
# Exports the metaData in `src/main/resources/` relative to the module root
./gradlew app-desktop:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/resources/
# Export only for a specific variant: `release`
./gradlew app-desktop:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/resources/ -PaboutLibraries.exportVariant=release

# Export dependencies to CLI in CSV format
./gradlew exportLibraries
./gradlew exportLibraries${Variant}

# Outputs all dependencies with name, version and their identifier
./gradlew findLibraries

# Exports all dependencies in a format helpful for compliance reports.
# By default writes `export.csv` and `export.txt` and `dependencies` folder in the root of the project.
./gradlew exportComplianceLibraries${Variant}

# List all funding options for included projects (as identified via the e.g.: GitHub API)
./gradlew fundLibraries

Special repository support

Host License Funding
GitHub x x

Disclaimer

This library uses all compile time dependencies (and their sub dependencies) as defined in the build.gradle file. This could lead to dependencies which are only used during compilation (and not actually distributed in the app) to be listed or missing in the attribution screen. It might also fail to identify licenses if the dependencies do not define it properly in their pom.xml file.

Careful optimisation and review of all licenses is recommended to really include all required dependencies. The use of the gradle commands like findLibraries can help doing this.

It is also important that native sub dependencies can not be resolved automatically as they are not included via gradle. Additional dependencies can be provided via the plugins API to extend and provide any additional details.

Developed By

License

Copyright 2024 Mike Penz

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

aboutlibraries's People

Contributors

allanwang avatar axelrindle avatar cyb3rko avatar dennisdeng2002 avatar dependabot[bot] avatar emmanuelmess avatar fabianterhorst avatar jaredsburrows avatar jhansen2015 avatar johnjohndoe avatar jsoref avatar kashban avatar koral-- avatar linus-hu avatar maresmar avatar mbiebl avatar mgray88 avatar mikepenz avatar mueller-ma avatar nailik avatar odin- avatar pddstudio avatar quadtriangle avatar rainer-lang avatar rpavlik avatar rubengees avatar rzimmer avatar thiagokimo avatar vanniktech avatar wkovacs64 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aboutlibraries's Issues

Long project name issue

If project name is too long (for example I used project with name 'Circular Progress Button') then it "eats" space from "author".
I tested on 480x800 screen.
For ViewPagerIndicator author name shown in 2 lines.
But for Circular Progress Button author name not shown at all (because it is out of screen, I think).

I have two solutions for this:

  1. Ellipsize project name, so that author name still can be visible (may be there can be issue with long author name too, so this is not very good solution)
  2. Show long names in 2 or more lines too. So that widths for name and author is pre-defined at some way.

I don't know which of solutions is better. May be better solution exist.

Of course, this problem can be solved with custom views, but out of box get good-looking UI is very good.

Placeholder are replaced

If no custom variable is set, the License placeholders are still replaced and are shown as ">>"

Use speaking artifact name

I suggest to change the name of the ouput files which is library-x.y.z.* at the moment. This is not very self explanatory when I have a list of dependencies such as on VersionEye. To change the name just define the following property in the build.gradle of the library module:

archivesBaseName = "aboutlibraries"

This will the produce the following output files:

~/.gradle/caches/modules-2/files-2.1/com.mikepenz.aboutlibraries/aboutlibraries/x.z.y/hash/aboutlibraries-x.y.z.pom
~/.gradle/caches/modules-2/files-2.1/com.mikepenz.aboutlibraries/aboutlibraries/x.z.y/hash/aboutlibraries-x.y.z.aar
~/.gradle/caches/modules-2/files-2.1/com.mikepenz.aboutlibraries/aboutlibraries/x.z.y/hash/aboutlibraries-x.y.z-sources.jar

The Gradle dependency would be this:

compile 'com.tundem.aboutlibraries:aboutlibraries:x.y.z'

I know it kind of redundant since the string "aboutlibraries" already appears in the group id. I cannot tell what people agree on as best practice - I did not duplicate the archivesBaseName in my library. You might consider renaming the group id as well in a future release.

VersionName and VersionCode

Please make it customizable:
For me I don't want the VersionCode to be shown.
VersionName and VersionCode are for me same.

Crashes unless CardView is added to Gradle dependencies

My code crashes with:

android.view.InflateException: Binary XML file line #2: Error inflating class android.support.v7.widget.CardView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:757)
at android.view.LayoutInflater.inflate(LayoutInflater.java:482)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at com.tundem.aboutlibraries.ui.adapter.LibsRecyclerViewAdapter.onCreateViewHolder(LibsRecyclerViewAdapter.java:58)

unless I add

compile 'com.android.support:cardview-v7:21.0.0'

to my Gradle dependencies.

https://github.com/mikepenz/AboutLibraries/blob/master/library/build.gradle contains this dependency so I'm not sure why it isn't transferring from the library to my main project.

Add dynamically generated licenses

Google Play Services generates the license text directly through the library, so to get the license you have to call
GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(this);
AboutLibraries should be able to get the license text directly from the GPS library or should be able to receive the license text in the bundle.

AboutLibraries' androidBackup=true collides with app's androidBackup=false

When including AboutLibraries in my App I get this error message on gradle build:

Error:(42, 9) Execution failed for task ':app:processDevelopmentDebugManifest'.
> Manifest merger failed : Attribute application@allowBackup value=(false) from AndroidManifest.xml:42:9
is also present at com.tundem.aboutlibraries:library:3.0.1:12:9 value=(true)
Suggestion: add 'tools:replace="android:allowBackup"' to <application> element at AndroidManifest.xml:40:5 to override

A Library should never set androidBackup=true in it's manifest, please fix.

Thanks and best regards,
Kash

OnClick feedback not shown

Enable the onClick feedback on an AboutLibraries Card for the whole card.

Right now the onClick listener consumes the touch event and so the ripple (v21+) or the click statelist drawable aren't shown.

Improve naming for bundle keys

As a new user of the library I find it quite difficult to understand the meaning and usage of the various bundle keys. I think by renaming some of them you could also remove a lot of the comments which describe their function.
Mostly, it is obvious - you can just re-use the variable names from the Java code. Do not shorten bundle names for the price of understanding problems. In general I would recommend to prefix all with BUNDLE_KEY_ for clarity.

Boolean values

Collection values

  • Rename BUNDLE_LIBS to BUNDLE_KEY_INTERNAL_LIBRARIES_KEYS
  • Rename BUNDLE_EXCLUDE_LIBS to BUNDLE_KEY_EXCLUDE_LIBRARIES_KEYS
  • Rename BUNDLE_FIELDS to BUNDLE_KEY_FIELDS - Actually this is the hardest one to understand. I cannot tell what this is used for from its name.

String values

... and so on.

show app name below icon

PLease make it also possible to show the app name like the icon and the versioninfo of the app.

Library not excluded from the list after i removed the .jar file

Hi!

I first ran the app and came to know that Picasso.jar was auto detected in the list which is nice, but after that i deleted it from the the libs folder and also updated the build path because i was no longer using it in the project.

But even after that i can see Picasso listed in the libraries. I think the on first run of the app it generates necessary files to indicate libraries used but it does not update on each run.

I am using the library as:

    LibsFragment fragment = new Libs.Builder()
            .withFields(R.string.class.getFields())
            // .withLibraries("showcaseview")
            .withVersionShown(true)
            .withAutoDetect(true)
            .withLicenseShown(true)
            .withLibraryModification("aboutlibraries",
                    Libs.LibraryFields.LIBRARY_NAME, "_AboutLibraries")
            .fragment();

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.frame_container, fragment).commit();

Thanks.

Autodetect library versions

Please correct me if I am wrong but I think with the current implementation all library version are hard-coded in either the supplied library XML or the library XML which people generated and manually added to their application projects.

I would love to see that the library version is parsed from build.gradle so no-one has to maintain this any longer. I like to mention Gradle-License-Report by @RobertFischer who pursues a similar thing for license information.

How to use in Eclipse?

Hi!

After the latest pull i am unable to use it in the Eclipse.

My project is looking weird, please check the attached picture.

Thanks.
capture

AndroidAnnotations listed by default

I added v.3.0.4 of the library (d8eb6) to a project ...

compile 'com.tundem.aboutlibraries:library:3.0.4'

... with the following configuration:

Intent intent = new Intent(getApplicationContext(), LibsActivity.class);
intent.putExtra(Libs.BUNDLE_FIELDS, Libs.toStringArray(R.string.class.getFields()));
intent.putExtra(Libs.BUNDLE_AUTODETECT, false);
intent.putExtra(Libs.BUNDLE_VERSION, true);
intent.putExtra(Libs.BUNDLE_LICENSE, true);
intent.putExtra(Libs.BUNDLE_TITLE, getString(R.string.title_activity_libraries));
intent.putExtra(Libs.BUNDLE_THEME, R.style.AppTheme);
startActivity(intent);

When I open the Activity I am quite surprised: There are two libraries listed:

As far as I can see neither AboutLibraries nor my project is referencing AndroidAnnotations. Why is it listed then?

make all methodes with ResId

Like in your MaterialDrawer lib. :-)
You made "withName(ResId)", could you also make

  • withActivityTitle
  • withAboutAppName
  • with AboutDescription
  • withAboutSpecial1-3
    ...
    In this great lib?

Allow programatically setting aboutAppDescription

I would like to sert the aboutAppDescription from within code, I have in the past built it from multiple strings and a build year which comes from the build scripts..

eg. the following would be handy.

 i.putExtra(Libs.BUNDLE_ABOUT_APP, 
    LicenseHelper.getAboutString(context) + "\n\n" +
            String.format(res.getString(R.string.about2), BuildConfig.buildYear) + "\n\n" +
            res.getString(R.string.about3));
);

Good work by the way, great idea..

Site to upload new libraries

instead of forking, commiting and send pull request, can you make a simple form where we can upload new libraries?

Or integration with android-arsenal at compile time ;)

Duplicate entries

Supplying the following BUNDLE_LIBS to the intent to launch the libs activity.
"eventbus", "androidviewpagerindicator", "picasso","roundedimageview", "okhttp","gson", "calligraphy", "discreetapprate", "appmsg", "scribe", "listviewanimations"

Some the libs I've added the resources for manually are repeated: appmsg ,calligraphy, scribe, listviewanimations.

Any ideas why?

Great library btw, thanks

   //Create an intent with context and the Activity class
    Intent i = new Intent(getApplicationContext(), LibsActivity.class);
    //Pass the fields of your application to the lib so it can find all external lib information
    i.putExtra(Libs.BUNDLE_FIELDS, Libs.toStringArray(R.string.class.getFields()));
    //Define the libs you want (only those who don't include the information, and are managed by the AboutLibraries library)
    //(OPTIONAL if all used libraries offer the information)
    i.putExtra(Libs.BUNDLE_LIBS, new String[]{"eventbus", "androidviewpagerindicator", "picasso","roundedimageview", "okhttp","gson", "calligraphy", "discreetapprate", "appmsg", "scribe", "listviewanimations"});
    //Display the library version (OPTIONAL)
    i.putExtra(Libs.BUNDLE_VERSION, false);
    //Display the library license (OPTIONAL
    i.putExtra(Libs.BUNDLE_LICENSE, true);

    i.putExtra(Libs.BUNDLE_TITLE, getString(R.string.settings_open_source));
    i.putExtra(Libs.BUNDLE_THEME, R.style.AppTheme);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);

eula integration

I suggest to make it possible to pass the eula: .setEula(R.string.xyz)
If passed then show an eula-button, maybe at the bottom of a also passed description but at top of the cards.
Please make it also possible to set the text of the eula-btn:
in English: "EULA"
in German: "Endbenutzerlizenzvereinbarung" ;-) --- a bit long :-(

Can't get definition of androidannotations from maven central

Hi Mike,

I pulled V3.0.3 from maven central but the definitions for AndroidAnnotations (my Pull Request) do seem to miss. I checked the values.xml in the package and indeed, it's missing.

Any chance to get a V 3.0.4 where this is included?

Best regards,
Kash

ActivityNotFoundException when using LibsCompatActivity

I use version 3.1.0 of the library in my project.

I am trying to change my implementation after running into this exception on Android 2.3.5:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp.debug/com.tundem.aboutlibraries.ui.LibsActivity}: java.lang.IllegalStateException: Please use the LibsCompatActivity for pre api level 11 applications

According to this exception in LibsActivity.onCreate I use LibsCompatActivity in the following code to load the libraries in an Activity:

Intent intent = new Intent(getApplicationContext(), LibsCompatActivity.class);
intent.putExtra(Libs.BUNDLE_FIELDS, Libs.toStringArray(R.string.class.getFields()));
intent.putExtra(Libs.BUNDLE_LIBS, new String[]{
        "crouton",
        "dagger",
        "retrofit"
});
intent.putExtra(Libs.BUNDLE_AUTODETECT, false);
intent.putExtra(Libs.BUNDLE_VERSION, true);
intent.putExtra(Libs.BUNDLE_LICENSE, true);
intent.putExtra(Libs.BUNDLE_TITLE, getString(R.string.title_activity_libraries));
intent.putExtra(Libs.BUNDLE_THEME, R.style.AppTheme);
startActivity(intent);

I seem to be using this in a wrong way since the app crashes on Android 2.3.5 as well as on Android 4.4.4. with the following error:

android.content.ActivityNotFoundException: Unable to find explicit activity class 
{com.example.myapp.debug/com.tundem.aboutlibraries.ui.LibsCompatActivity}; 
have you declared this activity in your AndroidManifest.xml?

E  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1541)
E  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1515)
E  at android.app.Activity.startActivityForResult(Activity.java:2988)
E  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:840)
E  at android.app.Activity.startActivity(Activity.java:3094)

Can you please update the documentation to clearly state how one should use the library for older Android versions?

Support for SDK version 20

I am running a project which still targets SDK version 20. I noticed that you depend on the support libraries in their latest version.

AboutLibraries dependencies

Are you planning to maintain the 3.x.x release of your library to support projects that cannot update instantaneously? I saw you released the former versions with another package name com.tundem.aboutlibraries on Maven Central.

Related commit: PREPARE NEW RELEASE v4.0.0

Library seems to be incompatible with Android Studio 1.2

I cannot add AboutLibraries to my project in AS 1.2 - it syncs Gradle fine, but fails to build the project with the error "Error:Execution failed for task ':bluetoothdetection:dexTrialDebug'.

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_40\bin\java.exe'' finished with non-zero exit value 2"

I've reproduced this 2 different times this week - all is well until I add compile('com.mikepenz.aboutlibraries:library:4.5.9@aar') { transitive = true }, and then it breaks again. Removing that dependency resolves the problem.

(I am using API 22 & v22 of all the required support libraries, so that might be the root cause as well.)

Wrong website URL returned for library defined via XML

I am using v.3.0.5 of the library with the following setup:

Intent intent = new Intent(getApplicationContext(), LibsActivity.class);
intent.putExtra(Libs.BUNDLE_FIELDS, Libs.toStringArray(R.string.class.getFields()));
intent.putExtra(Libs.BUNDLE_LIBS, new String[]{
    "androidslidinguppanel",
    "crouton",
    "dagger",
    "retrofit"
});
intent.putExtra(Libs.BUNDLE_AUTODETECT, false);
intent.putExtra(Libs.BUNDLE_VERSION, true);
intent.putExtra(Libs.BUNDLE_LICENSE, true);
intent.putExtra(Libs.BUNDLE_TITLE, getString(R.string.title_activity_libraries));
intent.putExtra(Libs.BUNDLE_THEME, R.style.AppTheme);
startActivity(intent);

I added Jackson as an additional library via the following definition file:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="define_jackson"/>
    <!-- Author section -->
    <string name="library_jackson_author">FasterXML, LLC</string>
    <string name="library_jackson_authorWebsite">http://fasterxml.com</string>
    <!-- Library section -->
    <string name="library_jackson_libraryName">Jackson</string>
    <string name="library_jackson_libraryDescription">
        Inspired by the quality and variety of XML tooling available for
        the Java platform (StAX, JAXB, etc.), the Jackson is a multi-purpose
        Java library for processing JSON data format. Jackson aims to be the
        best possible combination of fast, correct, lightweight, and
        ergonomic for developers.
    </string>
    <string name="library_jackson_libraryWebsite"/>
    <string name="library_jackson_libraryVersion">2.4.2</string>
    <!-- OpenSource section -->
    <string name="library_jackson_isOpenSource">true</string>
    <string name="library_jackson_repositoryLink">
        http://wiki.fasterxml.com/JacksonHome
    </string>
    <!-- ClassPath for autoDetect section -->
    <string name="library_jackson_classPath">
        com.fasterxml.jackson.databind
    </string>
    <!-- License section -->
    <string name="library_jackson_licenseId">apache_2_0</string>
    <!-- Custom variables section -->
</resources>

All libraries are listed in my app as expected.

When I tap the Jackson item nothing happens. Then I leave the Activity via BACK. When I relaunch the Activity and tap the item again it opens the website of AboutLibraries instead of the website of Jackson. It seems to have something to do with the XML file. I could not reproduce the bug with libraries defined in code only. I also successfully debugged the wrong website string in the LibsListViewAdapter.

Is there something wrong with the XML file or how I configured the library?

High minSdkVersion?

Correct me if I'm wrong, but I think the min SDK version is higher than it could be. I think the library can have a minSdkVersion of 7, and the sample one of 11, due to the CardsUI.

Can't set theme

It's not possible to overwrite the theme set in the Android Manifest

Overlayed ActionBar

Hi, first of all thanks for an awesome library.

In my app, I use an overlayed actionbar. Then I set the top padding of the root view to the actionbar size like this

android:paddingTop="?attr/actionBarSize"

If I use the Lib Activity, the top of the activity is hidden. Is it possible to add a bundle param to handle this case?

Create a way to add libraries on runtime

Some libraries, like the Google Play Services, require the app to load the licence on runtime. Defining an own XML file to include it therefor isn't possible. It would be great if there could be a way to add to the bundle/extras a certain class or data set to define a new library.

Wiki is outdated

Update all descriptions in the wiki
Update the included app list in the wiki

Simplify SetUp

Add new helper class to create a AboutLibraries activity or fragment with a builder pattern.

Something like this:

new AboutLibraries.Builder().withRessources(R.string...).withLibs("adfasdf", "adfsfd").showLicenses(true).start() / .build()

AutoDetect libraries

How about autodetecting which libraries are used without specifying them at all?

It can be done using Java Reflection - every library definition file will contain one classname for testing the library (preferably some important part of public API which will not change often)

Seems "style" doesn't change view's colors

With
i.putExtra(Libs.BUNDLE_THEME, R.style.AppTheme);
I can set theme for AboutLib.
My AppTheme is android:Theme.Holo.NoActionBar
And AboutLib activity starts with no action bar as expected.
If I change AppTheme to android.Theme.Holo, then Action bar is shown.
So, styling seems working.

But seems like styling not affects views themselves.
Seems views (which describes libs) are of android.Theme.Holo.Light. I mean, they always light.
So, for my app with dark theme I would like to get dark AboutLIbraries screen.

Of course, I can create custom views, but I would like to get desired UI out of box.

Am I right, that views always light, or maybe I'm doing something wrong?..

Repository link not being used

I noticed that some library items are clickable and others are not. Then I saw that the URL used for the OnClickListener of the library description is the libraryWebsite. I did not specify a website URL for all items. But I specified a repository URL for all of them since they are open source.

From using the definition file builder I expected that the repositoryLink URL is being used for the click. However, getRepositoryLink is not called at all. What's the purpose of the repository link then? Please clarify the usage in the definition file builder.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.