Coder Social home page Coder Social logo

extent-framework / extentreports-java Goto Github PK

View Code? Open in Web Editor NEW
211.0 22.0 123.0 2.19 MB

Extent Reporting Library, Java

Home Page: http://extentreports.com

License: Apache License 2.0

Java 87.35% FreeMarker 12.65%
extentreports java reporting

extentreports-java's Introduction

ExtentReports 5 Join the chat at https://gitter.im/anshooarora/extentreports Maven Central Build Status CodeFactor codecov

Documentation

Documentation for ExtentReports 5.x and lower versions is hosted on ExtentReports.com

Samples

Contributing

For more information on contributing to the ExtentReports project, please see CONTRIBUTING.md.

A complete list of contributors since ExtentReports migrated from @anshooarora/extentreports-java can be found here.

Upcoming

Versions

License

ExtentReports is Open Source software and ExtentReports 5.0 is released under Apache-2.0.

extentreports-java's People

Contributors

ansharora-clgx avatar anshooarora avatar datagitlies avatar dependabot[bot] avatar dietmar1963 avatar eliaslecomte avatar virenv 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

extentreports-java's Issues

Skipped test count are not shown in Dashboard

Some of my tests have been skipped due to the failure of some dependent tests. The same has been recorded correctly as test skipped in the logger html, but skipped tests in dashboard still shows ZERO.

screen shot 2018-11-19 at 1 17 36 pm
screen shot 2018-11-19 at 1 18 08 pm

Do I need to do some additional code to mark the test as skipped instead of
test.skip(MarkupHelper.createLabel(iTestResult.getName() + " - Test Case Skipped", ExtentColor.YELLOW)); in onTestSkipped(ITestResult) function?

Thanks in advance.

ExtentReport Class does not meet to configuration

After updating dependency with version 4, Extent Report class does not fetch in version 4.

Dependency :

		<!-- https://mvnrepository.com/artifact/com.aventstack/extentreports -->
		<dependency>
			<groupId>com.aventstack</groupId>
			<artifactId>extentreports</artifactId>
			<version>4.0.0</version>
		</dependency>

image

Am I missing something ?

no plain text in stack trace

stack trace in version 3.1.5
test report 1
html tags is plain text

stack trace in version 4.0.1
test report 2
html tags is not plain text

What's the use of attachReporter ?

I am a rookie. I'm confused with the method "extent.attachReporter(htmlReporter, klov)".

The klov report generated successfully , and the html report is in my local path.

But, how can I hyperlink from the klov server report to local html report?

After I use attachReporter method, where is the html report attached?

Test Step diagram missing

In version 4.0.6 the diagram for test steps is missing (was available in 3.1.5). Concerns test view and dashboard view.

tests_view_4 0 6

Extent Report Not Getting Generated

package com.fuseapp.qa.ExtentReportListner;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.testng.IReporter;
import org.testng.IResultMap;
import org.testng.ISuite;
import org.testng.ISuiteResult;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.xml.XmlSuite;

import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.ExtentTest;
import com.relevantcodes.extentreports.LogStatus;

public class ExtentReporterNG implements IReporter {
private ExtentReports extent;

public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites,
		String outputDirectory) {
	String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
	extent = new ExtentReports(outputDirectory + File.separator + timeStamp+"_"+"Test_Report"+ "Extent.html", true);

// extent = new ExtentReports (outputDirectory +File.separator+ timeStamp + ".html", true);

	for (ISuite suite : suites) {
		Map<String, ISuiteResult> result = suite.getResults();

		for (ISuiteResult r : result.values()) {
			ITestContext context = r.getTestContext();

			buildTestNodes(context.getPassedTests(), LogStatus.PASS);
			buildTestNodes(context.getFailedTests(), LogStatus.FAIL);
			buildTestNodes(context.getSkippedTests(), LogStatus.SKIP);
		}
	}

	extent.flush();
	extent.close();
}

private void buildTestNodes(IResultMap tests, LogStatus status) {
	ExtentTest test;

	if (tests.size() > 0) {
		for (ITestResult result : tests.getAllResults()) {
			test = extent.startTest(result.getMethod().getMethodName());

			test.setStartedTime(getTime(result.getStartMillis()));
			test.setEndedTime(getTime(result.getEndMillis()));

			for (String group : result.getMethod().getGroups())
				test.assignCategory(group);

			if (result.getThrowable() != null) {
				test.log(status, result.getThrowable());
			} else {
				test.log(status, "Test " + status.toString().toLowerCase()
						+ "ed");
			}

			extent.endTest(test);
			
		}
	}
}

private Date getTime(long millis) {
	Calendar calendar = Calendar.getInstance();
	calendar.setTimeInMillis(millis);
	return calendar.getTime();
}

}
................This is my code: I was able to generate extent report with this but, now it has stopped generating extent report.
POM:

	<dependency>
		<groupId>com.relevantcodes</groupId>
		<artifactId>extentreports</artifactId>
		<version>2.41.2</version>
	</dependency>

......
Please help me with the resolution.
I can share my repo details if required.

Unable to generate Extent reports using version 4

I'm using Extent report version 4,i've used same code mention in extent report java doc site but no lock and code is executed successfully but at last HTML report is not generating,any help will be appreciated.

Below is the Code:

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.reporter.ExtentAventReporter;
import io.github.bonigarcia.wdm.WebDriverManager;

public class Reporting {
	
	WebDriver driver;
	public static ExtentTest test;
	public static ExtentReports extent;
	
	public static void test() {
		
		// directory where output is to be printed
		ExtentAventReporter avent = new ExtentAventReporter(System.getProperty("user.dir") + "/reports/TestExecution.html");
		extent = new ExtentReports();
		extent.attachReporter(avent);
		test=extent.createTest("Login").assignAuthor("Rajesh");		

	}
	
	@AfterTest
	public void after(){
		
		driver.close();
		extent.flush();
	}
	

	
	@Test
	public void testings(){
		
		WebDriverManager.chromedriver().setup();
		
		driver = new ChromeDriver();
		test();
		test.pass("PASS");
		driver.get("http://www.google.com");
		
		
	}

}

Please merge changes from 3.1.6-SNAPSHOT to latest master or 4.0.9

Please merge changes from 3.1.6-SNAPSHOT to latest master or 4.0.9.

I am not sure if you could remember but an important fix https://github.com/anshooarora/klov/issues/45 went in 3.1.6-SNAPSHOT which addresses attaching screen sots to klov report. But looks like those changes were never merged back into master. If I use 4.0.9 or any latest version then I am still seeing issue java.io.IOException: The system cannot find the file specified but works fine if I use 3.1.6-SNAPSHOT.

Extent Report is not getting generated correctly.

I got a case in one of my projects where extentreport html is not getting generated properly .( i.e) Test cases are not showing , not able to go to category view and dashboard , basically , this is the view I am getting and not able to navigate by clicking on any link.

Version :- 4.0.9
Implementation :- Testng ITestListener
Console Errors :- Nothing
More Info :- Same test suite when executed on chrome , gives me report just fine . When Executed on Firefox 61 with geckodriver 0.21.0 , gives report like this :-

Screenshot :-
image

Html Source Code :-
https://drive.google.com/file/d/1oCWl84SlfYJ7v_aqhZ-4eKgHxK3fOVmH/view?usp=sharing

markup text is move to right

test report

ExtentTestManager.getEndNode().log(Status.INFO, MarkupHelper.createLabel(login, ExtentColor.BLUE));

version 4.0.4

Not able to change date/time format by customizing config file

Hi,

I'm using Extent Report version 4.0.1 and I want to change some settings in the report by customizing the config file. One of the changes I want to make is concerning the date and time format.

I tried to change the format by adjusting the config file.
Config file:
< dateFormat >dd-MM-yyyy< /dateFormat >
< timeFormat >HH:mm:ss< /timeFormat >

But the current output is as follows:
Nov 19, 2018 4:00:00 PM

The output as I wish it to be is something like this:
19 november 2018, 16:00

Is a date/time format like this possible? And if yes, how should I configure the config file?

FYI, I am using following dependencies:
com.aventstack, extentreports, version 4.0.1
com.vimalselvam, cucumber-extentsreport, version 3.1.1

Unable to update the charts when warning status is overwritten

Dependency used:

com.aventstack extentreports 3.0.0 com.relevantcodes extentreports 2.41.2

Steps to reproduce:

  1. Generate a report with warning status

  2. Add a JS code ๐Ÿ‘
    $('.test.warning').each(function() {
    $(this).addClass('pass').removeClass('warning');
    });
    $('.test-status.warning').each(function() {
    $(this).addClass('pass').removeClass('warning').text('pass with warning');
    });

     		$('.tests-quick-view .status.warning').each(function() {
     			$(this).addClass('pass').removeClass('warning').text('PASS'); 
     		});
     		testSetChart();
    

Error : unable to find the testSetChart

Auto-size pre/textarea/code size upon click

Issue

At present, the attached stacktrace or parsed XML/JSON in a code-block needs manually resizing which can be quite tricky in cases where the size of text is large.

Solution

Provide a way for user to simply click the target block and automatically resize it based upon its content size, using scrollHeight.

Media not found - Exception on attaching file - Relative path

Issue while attaching file into HTML reports

Exception occurred: java.io.IOException: Media was not found at [./a.jpg]

package reportsTest;
import java.io.IOException;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.MediaEntityBuilder;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;

public class ReportsExt {

public static void main(String[] args) throws IOException {
             
	        ExtentHtmlReporter html = new ExtentHtmlReporter("./reportsFolder/reports.html");
		ExtentReports extent = new ExtentReports();
		extent.attachReporter(html);
		ExtentTest test = extent.createTest("Attach ScreenShot");
		// this does not through any error but snap is not attaching to reports.
		test.pass("Passed", 
                MediaEntityBuilder.createScreenCaptureFromPath("./reportsFolder/a.jpg").build());
		// This attach the file in HTML but throwing exception as media not found
		test.pass("Passed", MediaEntityBuilder.createScreenCaptureFromPath("./a.jpg").build());
		extent.flush();
		
	}
}

Code from Media class, relative path is not working.

Instead of getPath, getAbsolutePath can be used.

		if(getPath() != null) {
			System.out.println("I am not null");
		}

		if(!new File(getPath()).exists()) {
			System.out.println("File does not exist");
		}else {
			System.out.println("File exist");
		}


		if (getPath() != null && !new File(getPath()).exists()) {
			throw new IOException("Media was not found at [" + getPath() + "]");
    	}
        public static String getPath() { 
    	          return "./a.jpg"; 
	}

Concurrent test execution issues

When I try to use the framework with concurrent tests execution it slows down everything significantly.
This issue was introduced in version 3.
The thing is that log method in ExtentTest class is synchronized and internally calls log method from ExtentReports class that is also synchronized. Such way, as I understand, the framework is not able to add log messages concurrently at all and this is a blocking issue for me and I have to stay on version 2.

Charts disappearing/resizing when switching views

I have been facing an issue related to the charts. They stop displaying after one clicks on any category available on the Category View, clicks back on Dashboard view and then again on another category.

Now, as you switch between the Test View and Dashboard View they start to increase in size gradually, as you can see down below.

![TestView when issue occurs]
(https://i.imgur.com/a4F1Fri.png)

![Dashboard - 1st click]
(https://i.imgur.com/t3p9Ur2.png)

![Dashboard - 2nd click]
(https://i.imgur.com/cG316Bg.png)

![Dashboard - 3rd click]
(https://i.imgur.com/u1OU0CH.png)

![Dashboard - 4th click]
(https://i.imgur.com/XX3ZEMO.png)

SparkHtmlReporter : setCSS is not working.

Hi,
setCSS is not working. Generated source shows that there is a nested <style> tag as shown below.

sparkHtmlReporter.config().setCSS(".test {display:block;}"); results in below

<style>
        <style type="text/css">
            .test {
                    display:block;
                  }
        </style>
    </style>

Way to Generate Anchor for each test ?

Hello,
as I have now wonderfull reports generated with ExtentHtmlReporter, I now have big reports containings tenth of tests :)
I would like to help users to generate direct links to a specific test (in order to add this link when creating an issue)
I tried to find a way to have an direct anchor but I did not find any

with Id in generated html .
I tried to generate a link with url ".../index.html#mytest_number54".
Is it possible to generate html anchors ?

For example on this screenshot, I would like to directly display Tnt1Shipment test when using url "index.html#Tnt1ShipmentMonoOrderAddStatus"
https://drive.google.com/file/d/1GE2XnepgLmyCZ9y3wxFk-Zu8XPtoeuuM/view?usp=sharing

How to update existing test during re-run

Hi,
This is same as many users reported earlier.We would need feature so that during rerun of failed tests when we use same report(earlier report) , if rerun passes it should overwrite earlier fail status.Please note that this is very important feature as customer always wants single report for execution (which we can create setting flag as False during initialization) but it should also contain final status as customer is interested in that only.
Test may fail due to scripting issues which test engineer would fix and rerun and we want only final status to be available in report. Can this be taken on priority?

Thanks,
Nilesh

[Poll] New Community Template

Hello all,

I have been working on the replacement for the current view created by ExtentHtmlReporter and wanted to hear your views whether the updated template can serve as a viable alternative.

Kindly see the demo below and let me know using ๐Ÿ‘ or ๐Ÿ‘Ž, or share your views, feedback, comments, or concerns with the replacement.

If there is enough support, the new template will be used as a replacement or else we will continue with and maintain the existing template. I would like to set 50 ๐Ÿ‘ or positive comments as the target number.

Demo

See here

Screenshots

test

dashboard

BDD - Add support for asterisk "*" for all dialects

Issue details: email2vimalraj/CucumberExtentReporter#58 (comment), attached below:

An asterisk can be used instead of Given, Then, When, And, But; to specify a step where the keyword is irrelevant. If i understand the above mentioned json file correctly that is also what is intended here with the asteriskses in every dialect, for example:
"en-pirate": {
"and": [
"* ",
"Aye "
],
"but": [
"* ",
"Avast! "
]
The asteriks does not necessarily have to convert into anything (if i understand your question right). It would be ok if it gets passed and parsed to the report as an asterisk. But indeed, it won't point to valid model in the report at the moment

category view filters are not working after version 2.x (In v3 and v4)

Coming from 2.41 , I noticed a change that the category view accumulative counts are not behaving as filters anymore .

Personally , we as a team , found this functionality to be extremely helpful for filtering out test cases that are failing in each category without having to scroll down the long list.

Is there any quickfix that can be applied to have this functionality , any references will be appreciated.

v2:-
image

v4:-

image

So , when we click on these PASS/Fail elements , it filters out the pass/fail test cases in the current category view in v2 , but its not working in v3 and v4.

Missing Offline Mode functionality

Upgrading from extentreports v2 I noticed there was only one breaking change - the lack of offline mode, which means we cannot run our automated tests in a box separated from the internet.
Is there a plan to re-implement this?
(Also extentreports is amazing)

Spark Reporter error

Extent version 6.0.7, after running the test case the next error is displayed:

0    [Thread-4] ERROR freemarker.runtime  - Error executing FreeMarker template
FreeMarker template error:
Template inclusion failed (for parameter value "../commons/commons-inject-js.ftl"):
Template not found for name "spark/partials/../commons/commons-inject-js.ftl" (normalized: "spark/commons/commons-inject-js.ftl").
The name was interpreted by this TemplateLoader: ClassTemplateLoader(resourceLoaderClass=com.aventstack.extentreports.ExtentReports, basePackagePath="view/" /* relatively to resourceLoaderClass pkg */).

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #include "../commons/commons-inject-j...  [in template "spark/partials/scripts.ftl" at line 3, column 1]
	- Reached through: #include "partials/scripts.ftl"  [in template "spark/test.ftl" at line 256, column 5]
----

Java stack trace (for programmers):
----
freemarker.core._MiscTemplateException: [... Exception message was already printed; see it above ...]
	at freemarker.core.Include.accept(Include.java:160)
	at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
	at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:48)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.Environment.include(Environment.java:2072)
	at freemarker.core.Include.accept(Include.java:167)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.MixedContent.accept(MixedContent.java:54)
	at freemarker.core.Environment.visit(Environment.java:324)
	at freemarker.core.Environment.process(Environment.java:302)
	at freemarker.template.Template.process(Template.java:325)
	at com.aventstack.extentreports.reporter.BasicFileReporter.processTemplate(BasicFileReporter.java:295)
	at com.aventstack.extentreports.reporter.ExtentSparkReporter.flush(ExtentSparkReporter.java:56)
	at com.aventstack.extentreports.ExtentObservable.lambda$25(ExtentObservable.java:544)
	at java.util.ArrayList.forEach(Unknown Source)
	at com.aventstack.extentreports.ExtentObservable.notifyReporters(ExtentObservable.java:544)
	at com.aventstack.extentreports.ExtentObservable.flush(ExtentObservable.java:429)
	at com.aventstack.extentreports.ExtentReports.flush(ExtentReports.java:275)
	at frameworkSrc.extentReports.TestListener.onFinish(TestListener.java:77)
	at org.testng.TestRunner.fireEvent(TestRunner.java:874)
	at org.testng.TestRunner.afterRun(TestRunner.java:837)
	at org.testng.TestRunner.run(TestRunner.java:592)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:398)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:392)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:354)
	at org.testng.SuiteRunner.run(SuiteRunner.java:302)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1145)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1067)
	at org.testng.TestNG.runSuites(TestNG.java:997)
	at org.testng.TestNG.run(TestNG.java:965)
	at frameworkSrc.userInterface.Screen_4$4.run(Screen_4.java:565)
	at java.lang.Thread.run(Unknown Source)
Caused by: freemarker.template.TemplateNotFoundException: Template not found for name "spark/partials/../commons/commons-inject-js.ftl" (normalized: "spark/commons/commons-inject-js.ftl").
The name was interpreted by this TemplateLoader: ClassTemplateLoader(resourceLoaderClass=com.aventstack.extentreports.ExtentReports, basePackagePath="view/" /* relatively to resourceLoaderClass pkg */).
	at freemarker.template.Configuration.getTemplate(Configuration.java:1833)
	at freemarker.core.Environment.getTemplateForInclusion(Environment.java:2044)
	at freemarker.core.Include.accept(Include.java:158)
	... 35 more

Implementation:

private static ExtentReports extent;
.
.
.
ExtentSparkReporter spark = new ExtentSparkReporter(sharepoint_path);
extent = new ExtentReports();
.
.
.
extent.attachReporter(spark);
.
.
.
spark.loadXMLConfig(extentXML_path);
.
.
.

Screenshot path doesn't respect reports path

When this code is executed

        ExtentReports extent = new ExtentReports();
        String filePath = "target/index.html";
        ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(filePath);
        htmlReporter.config().setReportName("Some Test Report");
        extent.attachReporter(htmlReporter);
        ExtentTest test = extent.createTest("Some Test");

        String imageFilePath = "target/someFile.png";
        File file = new File(imageFilePath);
        file.createNewFile();
        test.log(INFO, "Screenshot", MediaEntityBuilder
                .createScreenCaptureFromPath(imageFilePath)
                .build());
        extent.flush();

This td gets created in the html report

<td class='step-details'>
    Screenshot
    <img class='r-img' onerror='this.style.display="none"' data-featherlight='target/someFile.png' src='target/someFile.png' data-src='target/someFile.png'>
</td>

Obviously this is wrong as the files are created in this structure

  • target
    • someFile.png
    • index.html

and the src in the img tag should be someFile.png without a folder prefix.

I think MediaEntityBuilder must be aware of the reporter(s) to correctly provide the path when rendering the HTML. @anshooarora Would you agree?

Assigned devices are not displayed in the extent report

extentreports-4.0.6

I'm trying to assign devices on test cases but in the report nothing is displayed. I assign them like categories/authors. E.g.

static ExtentTest extentTest;
.
.
.
extentTest = extent.createTest(valueTitle, valueDescription);
extentTest.assignDevice("Chrome");

[feature request] Add possibility to scale down screenshots attached to the report(s)

At the moment ScreenShot provides following HTML using getSource()

 public String getSource() {
        if (getBase64String() != null)
            return "<br/><a href='" + getScreenCapturePath() + "' data-featherlight='image'><span class='label grey white-text'>base64-img</span></a>";

        return "<img class='r-img' onerror='this.style.display=\"none\"' data-featherlight='" + getScreenCapturePath() + "' src='" + getScreenCapturePath() + "' data-src='" + getScreenCapturePath() + "'>";
    }

It would be great to set width and height to for example 50% to scale down the image, very useful feature when testing on high resolution screens.

Potential solution:
Add width and height properties to ScreenShot class (potentially to Media class) set it in MediaEntityBuilder via overloaded createScreenCaptureFromPath() and use it in getSource().

@anshooarora What do you think?

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.