Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,13 @@ Methods that return a single object return that object directly:
User me = client.users.me().execute();
System.out.println("Hello " + me.name);

String workspaceId = me.workspaces.get(0).gid;
String workspaceId = me.workspaces.getWorkspace(0).gid;
Project project = client.projects.createInWorkspace(workspaceId)
.data("name", "new project")
.execute();
System.out.println("Created project with id: " + project.gid);

Methods that return multiple items (e.x. `findAll`) return an `Iterable` object. See the "Collections" section
Methods that return multiple items (e.x. `getTasks`, `getProjects`, `getPortfolios`, etc.) return an `Iterable` object. See the "Collections" section

Options
-------
Expand All @@ -135,7 +135,7 @@ Various options can be set globally on the `Client.DEFAULTS` object, per-client
client.options.put("page_size", 1000);

// per-request:
client.tasks.findAll().query("project", 1234).option("page_size", 1000).execute();
client.tasks.getTasks(null, null, null, null, "1234", null).execute();

### Available options

Expand Down Expand Up @@ -187,7 +187,7 @@ Collections

APIs that return a collection return a CollectionsRequest, which is an iterable:

Iterable<Workspace> workspaces = client.workspaces.findAll();
Iterable<Workspace> workspaces = client.workspaces.getWorkspaces();
for (Workspace workspace: workspaces) {
System.out.println("Workspace: " + workspace.name);
}
Expand All @@ -200,7 +200,7 @@ You can also use the raw API to fetch a page at a time:

String offset = null;
while (true) {
ResultBodyCollection<Workspace> page = client.workspaces.findAll()
ResultBodyCollection<Workspace> page = client.workspaces.getWorkspaces()
.option("offset", offset)
.option("limit", 2)
.executeRaw();
Expand Down
6 changes: 3 additions & 3 deletions examples/ExampleCreateProjectAndStreamEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ public static void main(String[] args) throws Exception {

// find your "Personal Projects" project
Workspace personalProjects = null;
for (Workspace workspace : client.workspaces.findAll()) {
for (Workspace workspace : client.workspaces.getWorkspaces()) {
if (workspace.name.equals("Personal Projects")) {
personalProjects = workspace;
break;
}
}

// create a "demo project" if it doesn't exist
List<Project> projects = client.projects.findByWorkspace(personalProjects.gid).execute();
List<Project> projects = client.projects.getProjectsForWorkspace(personalProjects.gid, false).execute();
Project demoProject = null;
for (Project project : projects) {
if (project.name.equals("demo project")) {
Expand All @@ -41,7 +41,7 @@ public static void main(String[] args) throws Exception {
}
}
if (demoProject == null) {
demoProject = client.projects.createInWorkspace(personalProjects.gid)
demoProject = client.projects.createProjectForWorkspace(personalProjects.gid)
.data("name", "demo project")
.execute();
}
Expand Down
8 changes: 4 additions & 4 deletions examples/ExampleCreateTaskAndUpload.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,15 @@ public static void main(String[] args) throws Exception {

// find your "Personal Projects" project
Workspace personalProjects = null;
for (Workspace workspace : client.workspaces.findAll()) {
for (Workspace workspace : client.workspaces.getWorkspaces()) {
if (workspace.name.equals("Personal Projects")) {
personalProjects = workspace;
break;
}
}

// create a "demo project" if it doesn't exist
List<Project> projects = client.projects.findByWorkspace(personalProjects.gid).execute();
List<Project> projects = client.projects.getProjectsForWorkspace(personalProjects.gid, false).execute();
Project demoProject = null;
for (Project project : projects) {
if (project.name.equals("demo project")) {
Expand All @@ -45,13 +45,13 @@ public static void main(String[] args) throws Exception {
}
}
if (demoProject == null) {
demoProject = client.projects.createInWorkspace(personalProjects.gid)
demoProject = client.projects.createProjectForWorkspace(personalProjects.gid)
.data("name", "demo project")
.execute();
}

// create a task in the project
Task demoTask = client.tasks.createInWorkspace(personalProjects.gid)
Task demoTask = client.tasks.createProjectForWorkspace(personalProjects.gid)
.data("name", "demo task created at " + new Date())
.data("projects", Arrays.asList(demoProject.gid))
.execute();
Expand Down
52 changes: 23 additions & 29 deletions src/test/java/com/asana/ClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ public void testClientGetWithNonEnglishCharacters() throws IOException
public void testClientGetCollectionList() throws IOException
{
String req = "{ \"data\": [ { \"gid\": 1 } ]}";
dispatcher.registerResponse("GET", "http://app/projects/1/tasks").code(200).content(req);
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=50&opt_pretty=false").code(200).content(req);

List<Task> tasks = client.tasks.findByProject("1").execute();
List<Task> tasks = client.tasks.getTasksForProject("1", null).execute();
assertEquals(1, tasks.size());
assertEquals("1", tasks.get(0).gid);
}
Expand All @@ -50,9 +50,9 @@ public void testClientGetCollectionList() throws IOException
public void testClientGetCollectionListWithNonEnglishCharacters() throws IOException
{
String req = "{ \"data\": [ { \"gid\": 1, \"name\": \"öäüßsøθæîó\" } ]}";
dispatcher.registerResponse("GET", "http://app/projects/1/tasks").code(200).content(req);
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=50&opt_pretty=false").code(200).content(req);

List<Task> tasks = client.tasks.findByProject("1").execute();
List<Task> tasks = client.tasks.getTasksForProject("1", null).execute();
assertEquals(1, tasks.size());
assertEquals("1", tasks.get(0).gid);
assertEquals("öäüßsøθæîó", tasks.get(0).name);
Expand All @@ -62,9 +62,9 @@ public void testClientGetCollectionListWithNonEnglishCharacters() throws IOExcep
public void testClientGetCollectionIterator() throws IOException
{
String req = "{ \"data\": [ { \"gid\": 1 } ]}";
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=50").code(200).content(req);
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=50&opt_pretty=false").code(200).content(req);

Iterator<Task> tasks = client.tasks.findByProject("1").iterator();
Iterator<Task> tasks = client.tasks.getTasksForProject("1", null).iterator();
assertEquals(true, tasks.hasNext());
assertEquals("1", tasks.next().gid);
assertEquals(false, tasks.hasNext());
Expand All @@ -73,36 +73,33 @@ public void testClientGetCollectionIterator() throws IOException
@Test
public void testClientPost() throws IOException
{
dispatcher.registerResponse("POST", "http://app/tasks").code(201).content("{ \"data\": { \"gid\": \"1\" }}");
dispatcher.registerResponse("POST", "http://app/tasks?opt_pretty=false").code(201).content("{ \"data\": { \"gid\": \"1\" }}");

assertEquals("1", client.tasks.create().execute().gid);
assertEquals("1", client.tasks.createTask().execute().gid);
}

@Test
public void testClientPut() throws IOException
{
dispatcher.registerResponse("PUT", "http://app/tasks/1").code(200).content("{ \"data\": { \"gid\": \"1\" }}");
dispatcher.registerResponse("PUT", "http://app/tasks/1?opt_pretty=false").code(200).content("{ \"data\": { \"gid\": \"1\" }}");

assertEquals("1", client.tasks.update("1").execute().gid);
assertEquals("1", client.tasks.updateTask("1").execute().gid);
}

@Test
public void testClientDelete() throws IOException
{
dispatcher.registerResponse("DELETE", "http://app/tasks/1").code(200).content("{ \"data\": { \"gid\": \"1\" }}");
dispatcher.registerResponse("DELETE", "http://app/tasks/1?opt_pretty=false").code(200).content("{ \"data\": { \"gid\": \"1\" }}");

assertEquals("1", client.tasks.delete("1").execute().gid);
assertEquals("1", client.tasks.deleteTask("1").execute().getAsJsonObject().get("gid").getAsString());
}

@Test
public void testGetNamedParameters() throws IOException
{
dispatcher.registerResponse("GET", "http://app/tasks?workspace=14916&assignee=me").code(200).content("{ \"data\": [{ \"gid\": \"1\" }]}");
dispatcher.registerResponse("GET", "http://app/tasks?assignee=me&limit=50&opt_pretty=false&workspace=14916").code(200).content("{ \"data\": [{ \"gid\": \"1\" }]}");

Collection<Task> result = client.tasks.findAll()
.query("workspace", "14916")
.query("assignee", "me")
.execute();
Collection<Task> result = client.tasks.getTasks(null, null, "14916", null, null, "me").execute();
assertEquals("1", result.iterator().next().gid);
}

Expand All @@ -111,9 +108,9 @@ public void testPostNamedParameters() throws IOException
{
JsonElement req = parser.parse("{ \"data\": { \"assignee\": \"1235\", \"followers\": [\"5678\"],\"name\": \"Hello, world.\"}}");

dispatcher.registerResponse("POST", "http://app/tasks").code(201).content("{ \"data\": { \"gid\": \"1\" }}");
dispatcher.registerResponse("POST", "http://app/tasks?opt_pretty=false").code(201).content("{ \"data\": { \"gid\": \"1\" }}");

Task result = client.tasks.create()
Task result = client.tasks.createTask()
.data("assignee", "1235")
.data("followers", Arrays.asList("5678"))
.data("name", "Hello, world.")
Expand All @@ -127,9 +124,9 @@ public void testPutNamedParameters() throws IOException
{
JsonElement req = parser.parse("{ \"data\": {\"assignee\": \"1235\", \"followers\": [\"5678\"],\"name\": \"Hello, world.\"}}");

dispatcher.registerResponse("PUT", "http://app/tasks/1001").code(200).content("{ \"data\": { \"gid\": \"1\" }}");
dispatcher.registerResponse("PUT", "http://app/tasks/1001?opt_pretty=false").code(200).content("{ \"data\": { \"gid\": \"1\" }}");

Task result = client.tasks.update("1001")
Task result = client.tasks.updateTask("1001")
.data("assignee", "1235")
.data("followers", Arrays.asList("5678"))
.data("name", "Hello, world.")
Expand All @@ -144,8 +141,7 @@ public void testPagination() throws IOException
String req = "{ \"data\": [ { \"gid\": 1 }],\"next_page\": {\"offset\": \"b\",\"path\": \"/tasks?project=1&limit=5&offset=b\",\"uri\": \"https://app.asana.com/api/1.0/tasks?project=1&limit=5&offset=b\"}}";
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=5&offset=a").code(200).content(req);

ResultBodyCollection<Task> result = client.tasks.findByProject("1")
.option("limit", 5).option("offset", "a")
ResultBodyCollection<Task> result = client.tasks.getTasksForProject("1", null, "a", 5, null, null)
.executeRaw();

assertEquals("1", result.data.get(0).gid);
Expand All @@ -169,8 +165,7 @@ public void testAsanaChangeLogging() throws IOException
.header("asana-change","name=string_ids;info=something;affected=true")
.header("asana-change", "name=new_sections;info=something;affected=true");

client.tasks.findByProject("1")
.option("limit", 5).option("offset", "a")
client.tasks.getTasksForProject("1", null, "a", 5, null, null)
.executeRaw();

assertEquals("Log level as expected?", Level.WARNING, handler.checkLevel() );
Expand All @@ -187,10 +182,10 @@ public void testAsanaChangeLoggingIgnoreCase() throws IOException
logger.setLevel(Level.ALL);

String req = "{ \"data\": [ { \"gid\": 1 }],\"next_page\": {\"offset\": \"b\",\"path\": \"/tasks?project=1&limit=5&offset=b\",\"uri\": \"https://app.asana.com/api/1.0/tasks?project=1&limit=5&offset=b\"}}";
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=5&offset=a").code(200).content(req)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=50&opt_pretty=false").code(200).content(req)
.header("AsANa-ChaNge","name=new_sections;info=something;affected=true");

client.tasks.findByProject("1")
client.tasks.getTasksForProject("1", null)
.option("limit", 5).option("offset", "a")
.executeRaw();

Expand All @@ -211,8 +206,7 @@ public void testAsanaChangeLoggingDontLogIfNotAffected() throws IOException
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=5&offset=a").code(200).content(req)
.header("asana-change", "name=new_sections;info=something");

client.tasks.findByProject("1")
.option("limit", 5).option("offset", "a")
client.tasks.getTasksForProject("1", null, "a", 5, null, null)
.executeRaw();

assertNotEquals("Log level as expected?", Level.WARNING, handler.checkLevel() );
Expand Down
32 changes: 16 additions & 16 deletions src/test/java/com/asana/IteratorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ public class IteratorTest extends AsanaTest
@Test
public void testItemIteratorEmpty() throws IOException
{
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&opt_pretty=false").code(200)
.content("{\"data\": []}");

Iterator<Task> iter = client.tasks.findByProject("1")
Iterator<Task> iter = client.tasks.getTasksForProject("1", null)
.option("item_limit", 2).option("page_size", 2)
.iterator();
assertEquals(false, iter.hasNext());
Expand All @@ -27,10 +27,10 @@ public void testItemIteratorEmpty() throws IOException
@Test
public void testItemIteratorItemLimitLessThanItems() throws IOException
{
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&opt_pretty=false").code(200)
.content("{\"data\": [{\"gid\":1},{\"gid\":2}],\"next_page\": { \"offset\": \"a\", \"path\": \"/projects/1/tasks?limit=2&offset=a\" }}");

Iterator<Task> iter = client.tasks.findByProject("1")
Iterator<Task> iter = client.tasks.getTasksForProject("1", null)
.option("item_limit", 2).option("page_size", 2)
.iterator();
assertEquals(true, iter.hasNext());
Expand All @@ -48,12 +48,12 @@ public void testItemIteratorEmptyPage() throws IOException
// of the first request there was another page, but at the time of actually requesting the next page all
// remaining items have meanwhile been removed. In the spirit of loose coupling, it is probably good not to
// overly rely on backend implementation details and verify this case, too.
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&opt_pretty=false").code(200)
.content("{\"data\": [{\"gid\":1},{\"gid\":2}],\"next_page\": { \"offset\": \"a\", \"path\": \"/projects/1/tasks?limit=2&offset=a\" }}");
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=1&offset=a").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=1&offset=a&opt_pretty=false").code(200)
.content("{ \"data\": [], \"next_page\": null }");

Iterator<Task> iter = client.tasks.findByProject("1")
Iterator<Task> iter = client.tasks.getTasksForProject("1", null)
.option("item_limit", 3).option("page_size", 2)
.iterator();
assertEquals(true, iter.hasNext());
Expand All @@ -66,12 +66,12 @@ public void testItemIteratorEmptyPage() throws IOException
@Test
public void testItemIteratorItemLimitEqualItems() throws IOException
{
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&opt_pretty=false").code(200)
.content("{\"data\": [{\"gid\":1},{\"gid\":2}],\"next_page\": { \"offset\": \"a\", \"path\": \"/projects/1/tasks?limit=2&offset=a\" }}");
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=1&offset=a").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=1&offset=a&opt_pretty=false").code(200)
.content("{ \"data\": [{\"gid\":3}], \"next_page\": null }");

Iterator<Task> iter = client.tasks.findByProject("1")
Iterator<Task> iter = client.tasks.getTasksForProject("1", null)
.option("item_limit", 3).option("page_size", 2)
.iterator();
assertEquals(true, iter.hasNext());
Expand All @@ -86,12 +86,12 @@ public void testItemIteratorItemLimitEqualItems() throws IOException
@Test
public void testItemIteratorItemLimitGreaterThanItems() throws IOException
{
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&opt_pretty=false").code(200)
.content("{\"data\": [{\"gid\":1},{\"gid\":2}],\"next_page\": { \"offset\": \"a\", \"path\": \"/projects/1/tasks?limit=2&offset=a\" }}");
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&offset=a").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&offset=a&opt_pretty=false").code(200)
.content("{ \"data\": [{\"gid\":3}], \"next_page\": null }");

Iterator<Task> iter = client.tasks.findByProject("1")
Iterator<Task> iter = client.tasks.getTasksForProject("1", null)
.option("item_limit", 4).option("page_size", 2)
.iterator();
assertEquals(true, iter.hasNext());
Expand All @@ -106,12 +106,12 @@ public void testItemIteratorItemLimitGreaterThanItems() throws IOException
@Test
public void testItemIteratorPreserveOptFields() throws IOException
{
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&opt_fields=foo").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=2&opt_pretty=false").code(200)
.content("{\"data\": [{\"gid\":1},{\"gid\":2}],\"next_page\": { \"offset\": \"a\", \"path\": \"/projects/1/tasks?limit=2&offset=a\" }}");
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=1&offset=a&opt_fields=foo").code(200)
dispatcher.registerResponse("GET", "http://app/projects/1/tasks?limit=1&offset=a&opt_pretty=false").code(200)
.content("{ \"data\": [{\"gid\":3}], \"next_page\": null }");

Iterator<Task> iter = client.tasks.findByProject("1")
Iterator<Task> iter = client.tasks.getTasksForProject("1", null)
.option("fields", Arrays.asList("foo"))
.option("item_limit", 3).option("page_size", 2)
.iterator();
Expand Down
Loading