From dd5fc96a463543c2522ee65e3923ce8db2b24401 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 1 Aug 2022 12:15:34 -0400 Subject: [PATCH 001/114] adding lombok pojo example --- .../spring6restmvc/model/Beer.java | 23 +++++++++++++++++++ .../spring6restmvc/model/BeerStyle.java | 8 +++++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/model/Beer.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Beer.java b/src/main/java/guru/springframework/spring6restmvc/model/Beer.java new file mode 100644 index 000000000..d1cc96aae --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/model/Beer.java @@ -0,0 +1,23 @@ +package guru.springframework.spring6restmvc.model; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Data +public class Beer { + private UUID id; + private Integer version; + private String beerName; + private BeerStyle beerStyle; + private String upc; + private Integer quantityOnHand; + private BigDecimal price; + private LocalDateTime createdDate; + private LocalDateTime updateDate; +} diff --git a/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java new file mode 100644 index 000000000..78a1b30df --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerStyle.java @@ -0,0 +1,8 @@ +package guru.springframework.spring6restmvc.model; + +/** + * Created by jt, Spring Framework Guru. + */ +public enum BeerStyle { + LAGER, PILSNER, STOUT, GOSE, PORTER, ALE, WHEAT, IPA, PALE_ALE, SAISON +} From a61a40addb93b05f8c693643869691afa2718629 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 1 Aug 2022 12:26:01 -0400 Subject: [PATCH 002/114] adding builder example --- .../spring6restmvc/model/Beer.java | 2 ++ .../spring6restmvc/services/BeerService.java | 13 +++++++++ .../services/BeerServiceImpl.java | 28 +++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/BeerService.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Beer.java b/src/main/java/guru/springframework/spring6restmvc/model/Beer.java index d1cc96aae..1aed54c28 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/Beer.java @@ -1,5 +1,6 @@ package guru.springframework.spring6restmvc.model; +import lombok.Builder; import lombok.Data; import java.math.BigDecimal; @@ -9,6 +10,7 @@ /** * Created by jt, Spring Framework Guru. */ +@Builder @Data public class Beer { private UUID id; diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java new file mode 100644 index 000000000..70ef7fdd3 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -0,0 +1,13 @@ +package guru.springframework.spring6restmvc.services; + +import guru.springframework.spring6restmvc.model.Beer; + +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +public interface BeerService { + + Beer getBeerById(UUID id); +} diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java new file mode 100644 index 000000000..d094b3198 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -0,0 +1,28 @@ +package guru.springframework.spring6restmvc.services; + +import guru.springframework.spring6restmvc.model.Beer; +import guru.springframework.spring6restmvc.model.BeerStyle; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +public class BeerServiceImpl implements BeerService { + @Override + public Beer getBeerById(UUID id) { + return Beer.builder() + .id(id) + .version(1) + .beerName("Galaxy Cat") + .beerStyle(BeerStyle.PALE_ALE) + .upc("12356") + .price(new BigDecimal("12.99")) + .quantityOnHand(122) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + } +} From f915f3c252fb48b55ca0ca52603776e364d1828c Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 1 Aug 2022 12:31:49 -0400 Subject: [PATCH 003/114] adding constructor example --- .../spring6restmvc/controller/BeerController.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java new file mode 100644 index 000000000..e250d840e --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -0,0 +1,15 @@ +package guru.springframework.spring6restmvc.controller; + +import guru.springframework.spring6restmvc.services.BeerService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Controller; + +/** + * Created by jt, Spring Framework Guru. + */ +@AllArgsConstructor +@Controller +public class BeerController { + private final BeerService beerService; + +} From 88257705b631fca0804ac3ae1c7c6d6b63b3b05c Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 1 Aug 2022 12:42:54 -0400 Subject: [PATCH 004/114] adding lombok logging example --- .../controller/BeerController.java | 12 ++++++++++ .../services/BeerServiceImpl.java | 7 ++++++ src/main/resources/application.properties | 1 + .../controller/BeerControllerTest.java | 23 +++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index e250d840e..53df65356 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -1,15 +1,27 @@ package guru.springframework.spring6restmvc.controller; +import guru.springframework.spring6restmvc.model.Beer; import guru.springframework.spring6restmvc.services.BeerService; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; +import java.util.UUID; + /** * Created by jt, Spring Framework Guru. */ +@Slf4j @AllArgsConstructor @Controller public class BeerController { private final BeerService beerService; + public Beer getBeerById(UUID id){ + + log.debug("Get Beer by Id - in controller"); + + return beerService.getBeerById(id); + } + } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index d094b3198..243e48ec7 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -2,6 +2,8 @@ import guru.springframework.spring6restmvc.model.Beer; import guru.springframework.spring6restmvc.model.BeerStyle; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -10,9 +12,14 @@ /** * Created by jt, Spring Framework Guru. */ +@Slf4j +@Service public class BeerServiceImpl implements BeerService { @Override public Beer getBeerById(UUID id) { + + log.debug("Get Beer by Id - in service. Id: " + id.toString()); + return Beer.builder() .id(id) .version(1) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b1378917..d0afd80b5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,2 @@ +logging.level.guru.springframework=debug diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java new file mode 100644 index 000000000..114e81bcd --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -0,0 +1,23 @@ +package guru.springframework.spring6restmvc.controller; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class BeerControllerTest { + + @Autowired + BeerController beerController; + + @Test + void getBeerById() { + + System.out.println(beerController.getBeerById(UUID.randomUUID())); + + } +} \ No newline at end of file From ff0886b0b88fd6a2dacd42fb986fed589159c22f Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 2 Aug 2022 08:46:21 -0400 Subject: [PATCH 005/114] adding list example --- .../controller/BeerController.java | 11 +++- .../spring6restmvc/services/BeerService.java | 3 ++ .../services/BeerServiceImpl.java | 54 ++++++++++++++++--- 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 53df65356..7685e9d62 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -4,8 +4,10 @@ import guru.springframework.spring6restmvc.services.BeerService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; import java.util.UUID; /** @@ -13,10 +15,15 @@ */ @Slf4j @AllArgsConstructor -@Controller +@RestController public class BeerController { private final BeerService beerService; + @RequestMapping("/api/v1/beer") + public List listBeers(){ + return beerService.listBeers(); + } + public Beer getBeerById(UUID id){ log.debug("Get Beer by Id - in controller"); diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index 70ef7fdd3..0b63a1030 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -2,6 +2,7 @@ import guru.springframework.spring6restmvc.model.Beer; +import java.util.List; import java.util.UUID; /** @@ -9,5 +10,7 @@ */ public interface BeerService { + List listBeers(); + Beer getBeerById(UUID id); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index 243e48ec7..65d3ab6f3 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -7,7 +7,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.UUID; +import java.util.*; /** * Created by jt, Spring Framework Guru. @@ -15,13 +15,14 @@ @Slf4j @Service public class BeerServiceImpl implements BeerService { - @Override - public Beer getBeerById(UUID id) { - log.debug("Get Beer by Id - in service. Id: " + id.toString()); + private Map beerMap; + + public BeerServiceImpl() { + this.beerMap = new HashMap<>(); - return Beer.builder() - .id(id) + Beer beer1 = Beer.builder() + .id(UUID.randomUUID()) .version(1) .beerName("Galaxy Cat") .beerStyle(BeerStyle.PALE_ALE) @@ -31,5 +32,46 @@ public Beer getBeerById(UUID id) { .createdDate(LocalDateTime.now()) .updateDate(LocalDateTime.now()) .build(); + + Beer beer2 = Beer.builder() + .id(UUID.randomUUID()) + .version(1) + .beerName("Crank") + .beerStyle(BeerStyle.PALE_ALE) + .upc("12356222") + .price(new BigDecimal("11.99")) + .quantityOnHand(392) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Beer beer3 = Beer.builder() + .id(UUID.randomUUID()) + .version(1) + .beerName("Sunshine City") + .beerStyle(BeerStyle.IPA) + .upc("12356") + .price(new BigDecimal("13.99")) + .quantityOnHand(144) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + beerMap.put(beer1.getId(), beer1); + beerMap.put(beer2.getId(), beer2); + beerMap.put(beer3.getId(), beer3); + } + + @Override + public List listBeers(){ + return new ArrayList<>(beerMap.values()); + } + + @Override + public Beer getBeerById(UUID id) { + + log.debug("Get Beer by Id - in service. Id: " + id.toString()); + + return beerMap.get(id); } } From 6e93550ad9237e459930e997c12b7a9b8bc7a255 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 3 Aug 2022 08:25:46 -0400 Subject: [PATCH 006/114] adding get beer by id --- .../spring6restmvc/controller/BeerController.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 7685e9d62..5b15427eb 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -4,7 +4,9 @@ import guru.springframework.spring6restmvc.services.BeerService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -16,19 +18,21 @@ @Slf4j @AllArgsConstructor @RestController +@RequestMapping("/api/v1/beer") public class BeerController { private final BeerService beerService; - @RequestMapping("/api/v1/beer") + @RequestMapping(method = RequestMethod.GET) public List listBeers(){ return beerService.listBeers(); } - public Beer getBeerById(UUID id){ + @RequestMapping(value = "{beerId}", method = RequestMethod.GET) + public Beer getBeerById(@PathVariable("beerId") UUID beerId){ log.debug("Get Beer by Id - in controller"); - return beerService.getBeerById(id); + return beerService.getBeerById(beerId); } } From 4817f4f664d950fb8e04878643c7babf281f4f00 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 09:58:00 -0400 Subject: [PATCH 007/114] adding customer example --- .../controller/CustomerController.java | 34 ++++++++++ .../spring6restmvc/model/Customer.java | 21 ++++++ .../services/CustomerService.java | 17 +++++ .../services/CustomerServiceImpl.java | 68 +++++++++++++++++++ 4 files changed, 140 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/model/Customer.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java new file mode 100644 index 000000000..c2d9a398c --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -0,0 +1,34 @@ +package guru.springframework.spring6restmvc.controller; + +import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.services.CustomerService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@RequestMapping("/api/v1/customer") +@RequiredArgsConstructor +@RestController +public class CustomerController { + + private final CustomerService customerService; + + @RequestMapping(method = RequestMethod.GET) + public List listAllCustomers(){ + return customerService.getAllCustomers(); + } + + @RequestMapping(value = "{customerId}", method = RequestMethod.GET) + public Customer getCustomerById(@PathVariable("customerId") UUID id){ + return customerService.getCustomerById(id); + } + +} diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Customer.java b/src/main/java/guru/springframework/spring6restmvc/model/Customer.java new file mode 100644 index 000000000..195ae3e72 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/model/Customer.java @@ -0,0 +1,21 @@ +package guru.springframework.spring6restmvc.model; + +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Data +@Builder +public class Customer { + + private String name; + private UUID id; + private Integer version; + private LocalDateTime createdDate; + private LocalDateTime updateDate; +} diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java new file mode 100644 index 000000000..c51532b78 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -0,0 +1,17 @@ +package guru.springframework.spring6restmvc.services; + +import guru.springframework.spring6restmvc.model.Customer; + +import java.util.List; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +public interface CustomerService { + + Customer getCustomerById(UUID uuid); + + List getAllCustomers(); + +} diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java new file mode 100644 index 000000000..4077d75d0 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -0,0 +1,68 @@ +package guru.springframework.spring6restmvc.services; + +import guru.springframework.spring6restmvc.model.Customer; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.*; + +/** + * Created by jt, Spring Framework Guru. + */ +@Service +public class CustomerServiceImpl implements CustomerService { + + private Map customerMap; + + public CustomerServiceImpl() { + Customer customer1 = Customer.builder() + .id(UUID.randomUUID()) + .name("Customer 1") + .version(1) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Customer customer2 = Customer.builder() + .id(UUID.randomUUID()) + .name("Customer 2") + .version(1) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Customer customer3 = Customer.builder() + .id(UUID.randomUUID()) + .name("Customer 3") + .version(1) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + customerMap = new HashMap<>(); + customerMap.put(customer1.getId(), customer1); + customerMap.put(customer2.getId(), customer2); + customerMap.put(customer3.getId(), customer3); + } + + @Override + public Customer getCustomerById(UUID uuid) { + return customerMap.get(uuid); + } + + @Override + public List getAllCustomers() { + return new ArrayList<>(customerMap.values()); + } +} + + + + + + + + + + + From d681fe55ec315aab71832e887ae85391239d937c Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 10:32:39 -0400 Subject: [PATCH 008/114] adding dev tools --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 4b24b989d..fce3dcb4c 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,11 @@ spring-boot-starter-web + + org.springframework.boot + spring-boot-devtools + + org.projectlombok lombok From e82519d5b806c392bfbe6f05b8a7475114902f76 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 10:50:07 -0400 Subject: [PATCH 009/114] adding http post example --- .../controller/BeerController.java | 16 ++++++--- .../spring6restmvc/services/BeerService.java | 2 ++ .../services/BeerServiceImpl.java | 36 +++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 5b15427eb..a42446f36 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -4,10 +4,9 @@ import guru.springframework.spring6restmvc.services.BeerService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.UUID; @@ -22,6 +21,15 @@ public class BeerController { private final BeerService beerService; + @PostMapping + //@RequestMapping(method = RequestMethod.POST) + public ResponseEntity handlePost(@RequestBody Beer beer){ + + Beer savedBeer = beerService.saveNewBeer(beer); + + return new ResponseEntity(HttpStatus.CREATED); + } + @RequestMapping(method = RequestMethod.GET) public List listBeers(){ return beerService.listBeers(); diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index 0b63a1030..4dc7384fa 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -13,4 +13,6 @@ public interface BeerService { List listBeers(); Beer getBeerById(UUID id); + + Beer saveNewBeer(Beer beer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index 65d3ab6f3..c461bb60d 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -74,4 +74,40 @@ public Beer getBeerById(UUID id) { return beerMap.get(id); } + + @Override + public Beer saveNewBeer(Beer beer) { + + Beer savedBeer = Beer.builder() + .id(UUID.randomUUID()) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .beerName(beer.getBeerName()) + .beerStyle(beer.getBeerStyle()) + .quantityOnHand(beer.getQuantityOnHand()) + .upc(beer.getUpc()) + .price(beer.getPrice()) + .build(); + + beerMap.put(savedBeer.getId(), savedBeer); + + return savedBeer; + } } + + + + + + + + + + + + + + + + + From 4eadbe2df9718b6f84e822d9d122b3156b5aeea0 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 10:59:05 -0400 Subject: [PATCH 010/114] adding http response header --- .../spring6restmvc/controller/BeerController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index a42446f36..eaf16c894 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -4,6 +4,7 @@ import guru.springframework.spring6restmvc.services.BeerService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -27,7 +28,10 @@ public ResponseEntity handlePost(@RequestBody Beer beer){ Beer savedBeer = beerService.saveNewBeer(beer); - return new ResponseEntity(HttpStatus.CREATED); + HttpHeaders headers = new HttpHeaders(); + headers.add("Location", "/api/v1/beer/" + savedBeer.getId().toString()); + + return new ResponseEntity(headers, HttpStatus.CREATED); } @RequestMapping(method = RequestMethod.GET) From b2f5f740dedc902917de8c419face0758f091e3e Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 11:31:19 -0400 Subject: [PATCH 011/114] adding http POST for customer --- .../controller/CustomerController.java | 18 ++++++++++++++---- .../services/BeerServiceImpl.java | 1 + .../services/CustomerService.java | 1 + .../services/CustomerServiceImpl.java | 16 ++++++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index c2d9a398c..3a4467073 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -3,10 +3,10 @@ import guru.springframework.spring6restmvc.model.Customer; import guru.springframework.spring6restmvc.services.CustomerService; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.UUID; @@ -21,6 +21,16 @@ public class CustomerController { private final CustomerService customerService; + @PostMapping + public ResponseEntity handlePost(@RequestBody Customer customer){ + Customer savedCustomer = customerService.saveNewCustomer(customer); + + HttpHeaders headers = new HttpHeaders(); + headers.add("Location", "/api/v1/customer/" + savedCustomer.getId().toString()); + + return new ResponseEntity(headers, HttpStatus.CREATED); + } + @RequestMapping(method = RequestMethod.GET) public List listAllCustomers(){ return customerService.getAllCustomers(); diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index c461bb60d..ad9dc0493 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -80,6 +80,7 @@ public Beer saveNewBeer(Beer beer) { Beer savedBeer = Beer.builder() .id(UUID.randomUUID()) + .version(1) .createdDate(LocalDateTime.now()) .updateDate(LocalDateTime.now()) .beerName(beer.getBeerName()) diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java index c51532b78..a5b631534 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -14,4 +14,5 @@ public interface CustomerService { List getAllCustomers(); + Customer saveNewCustomer(Customer customer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java index 4077d75d0..331141d54 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -45,6 +45,22 @@ public CustomerServiceImpl() { customerMap.put(customer3.getId(), customer3); } + @Override + public Customer saveNewCustomer(Customer customer) { + + Customer savedCustomer = Customer.builder() + .id(UUID.randomUUID()) + .version(1) + .updateDate(LocalDateTime.now()) + .createdDate(LocalDateTime.now()) + .name(customer.getName()) + .build(); + + customerMap.put(savedCustomer.getId(), savedCustomer); + + return savedCustomer; + } + @Override public Customer getCustomerById(UUID uuid) { return customerMap.get(uuid); From d86ffc04ab12e4f5a857d0bcf097d8af63dfb221 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 13:25:10 -0400 Subject: [PATCH 012/114] adding put for beer object --- .../spring6restmvc/controller/BeerController.java | 8 ++++++++ .../spring6restmvc/services/BeerService.java | 2 ++ .../spring6restmvc/services/BeerServiceImpl.java | 11 +++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index eaf16c894..660045841 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -22,6 +22,14 @@ public class BeerController { private final BeerService beerService; + @PutMapping("{beerId}") + public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBody Beer beer){ + + beerService.updateBeerById(beerId, beer); + + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + @PostMapping //@RequestMapping(method = RequestMethod.POST) public ResponseEntity handlePost(@RequestBody Beer beer){ diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index 4dc7384fa..e5ffac302 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -15,4 +15,6 @@ public interface BeerService { Beer getBeerById(UUID id); Beer saveNewBeer(Beer beer); + + void updateBeerById(UUID beerId, Beer beer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index ad9dc0493..d7afd0007 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -62,6 +62,17 @@ public BeerServiceImpl() { beerMap.put(beer3.getId(), beer3); } + @Override + public void updateBeerById(UUID beerId, Beer beer) { + Beer existing = beerMap.get(beerId); + existing.setBeerName(beer.getBeerName()); + existing.setPrice(beer.getPrice()); + existing.setUpc(beer.getUpc()); + existing.setQuantityOnHand(beer.getQuantityOnHand()); + + beerMap.put(existing.getId(), existing); + } + @Override public List listBeers(){ return new ArrayList<>(beerMap.values()); From c0ae26bf311acdebd6ef68aa7d90905863ddc924 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 13:44:34 -0400 Subject: [PATCH 013/114] adding PUT for Customer --- .../spring6restmvc/controller/CustomerController.java | 9 +++++++++ .../spring6restmvc/services/BeerServiceImpl.java | 2 -- .../spring6restmvc/services/CustomerService.java | 2 ++ .../spring6restmvc/services/CustomerServiceImpl.java | 6 ++++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index 3a4467073..f87917b23 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -21,6 +21,15 @@ public class CustomerController { private final CustomerService customerService; + @PutMapping("{customerId}") + public ResponseEntity updateCustomerByID(@PathVariable("customerId") UUID customerId, + @RequestBody Customer customer){ + + customerService.updateCustomerById(customerId, customer); + + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + @PostMapping public ResponseEntity handlePost(@RequestBody Customer customer){ Customer savedCustomer = customerService.saveNewCustomer(customer); diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index d7afd0007..d8096c065 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -69,8 +69,6 @@ public void updateBeerById(UUID beerId, Beer beer) { existing.setPrice(beer.getPrice()); existing.setUpc(beer.getUpc()); existing.setQuantityOnHand(beer.getQuantityOnHand()); - - beerMap.put(existing.getId(), existing); } @Override diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java index a5b631534..21d8709ca 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -15,4 +15,6 @@ public interface CustomerService { List getAllCustomers(); Customer saveNewCustomer(Customer customer); + + void updateCustomerById(UUID customerId, Customer customer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java index 331141d54..22d813e96 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -45,6 +45,12 @@ public CustomerServiceImpl() { customerMap.put(customer3.getId(), customer3); } + @Override + public void updateCustomerById(UUID customerId, Customer customer) { + Customer existing = customerMap.get(customerId); + existing.setName(customer.getName()); + } + @Override public Customer saveNewCustomer(Customer customer) { From dacb0681c8be1bcd87b2dafb78a3e5562ca85802 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 13:56:04 -0400 Subject: [PATCH 014/114] adding delete --- .../spring6restmvc/controller/BeerController.java | 8 ++++++++ .../spring6restmvc/services/BeerService.java | 2 ++ .../spring6restmvc/services/BeerServiceImpl.java | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 660045841..6f081882d 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -22,6 +22,14 @@ public class BeerController { private final BeerService beerService; + @DeleteMapping("{beerId}") + public ResponseEntity deleteById(@PathVariable("beerId") UUID beerId){ + + beerService.deleteById(beerId); + + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + @PutMapping("{beerId}") public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBody Beer beer){ diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index e5ffac302..a83e28eff 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -17,4 +17,6 @@ public interface BeerService { Beer saveNewBeer(Beer beer); void updateBeerById(UUID beerId, Beer beer); + + void deleteById(UUID beerId); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index d8096c065..00c55ce55 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -62,6 +62,11 @@ public BeerServiceImpl() { beerMap.put(beer3.getId(), beer3); } + @Override + public void deleteById(UUID beerId) { + beerMap.remove(beerId); + } + @Override public void updateBeerById(UUID beerId, Beer beer) { Beer existing = beerMap.get(beerId); From e6e4570e3c2bd2cf8f18d1605b04fc9db1c1af07 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 14:07:38 -0400 Subject: [PATCH 015/114] adding delete customer --- .../spring6restmvc/controller/CustomerController.java | 8 ++++++++ .../spring6restmvc/services/CustomerService.java | 2 ++ .../spring6restmvc/services/CustomerServiceImpl.java | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index f87917b23..a65a219de 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -21,6 +21,14 @@ public class CustomerController { private final CustomerService customerService; + @DeleteMapping("{customerId}") + public ResponseEntity deleteCustomerById(@PathVariable("customerId") UUID customerId){ + + customerService.deleteCustomerById(customerId); + + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + @PutMapping("{customerId}") public ResponseEntity updateCustomerByID(@PathVariable("customerId") UUID customerId, @RequestBody Customer customer){ diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java index 21d8709ca..f09824e4e 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -17,4 +17,6 @@ public interface CustomerService { Customer saveNewCustomer(Customer customer); void updateCustomerById(UUID customerId, Customer customer); + + void deleteCustomerById(UUID customerId); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java index 22d813e96..9e3aad909 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -45,6 +45,11 @@ public CustomerServiceImpl() { customerMap.put(customer3.getId(), customer3); } + @Override + public void deleteCustomerById(UUID customerId) { + customerMap.remove(customerId); + } + @Override public void updateCustomerById(UUID customerId, Customer customer) { Customer existing = customerMap.get(customerId); From f7dee9c0492a0e0c8ee931e71c80d10370382190 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 4 Aug 2022 14:28:34 -0400 Subject: [PATCH 016/114] adding patch example --- .../controller/BeerController.java | 8 ++++++ .../spring6restmvc/services/BeerService.java | 2 ++ .../services/BeerServiceImpl.java | 26 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 6f081882d..6e972f198 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -22,6 +22,14 @@ public class BeerController { private final BeerService beerService; + @PatchMapping("{beerId}") + public ResponseEntity updateBeerPatchById(@PathVariable("beerId")UUID beerId, @RequestBody Beer beer){ + + beerService.patchBeerById(beerId, beer); + + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + @DeleteMapping("{beerId}") public ResponseEntity deleteById(@PathVariable("beerId") UUID beerId){ diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index a83e28eff..426739d82 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -19,4 +19,6 @@ public interface BeerService { void updateBeerById(UUID beerId, Beer beer); void deleteById(UUID beerId); + + void patchBeerById(UUID beerId, Beer beer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index 00c55ce55..d1dcd4edf 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -4,6 +4,7 @@ import guru.springframework.spring6restmvc.model.BeerStyle; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -62,6 +63,31 @@ public BeerServiceImpl() { beerMap.put(beer3.getId(), beer3); } + @Override + public void patchBeerById(UUID beerId, Beer beer) { + Beer existing = beerMap.get(beerId); + + if (StringUtils.hasText(beer.getBeerName())){ + existing.setBeerName(beer.getBeerName()); + } + + if (beer.getBeerStyle() != null) { + existing.setBeerStyle(beer.getBeerStyle()); + } + + if (beer.getPrice() != null) { + existing.setPrice(beer.getPrice()); + } + + if (beer.getQuantityOnHand() != null){ + existing.setQuantityOnHand(beer.getQuantityOnHand()); + } + + if (StringUtils.hasText(beer.getUpc())) { + existing.setUpc(beer.getUpc()); + } + } + @Override public void deleteById(UUID beerId) { beerMap.remove(beerId); From 398299c1b2da86dadce90d2282ca5bbc00302584 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 8 Aug 2022 15:52:05 -0400 Subject: [PATCH 017/114] adding mockmvc config --- .../controller/BeerController.java | 4 ++-- .../controller/BeerControllerTest.java | 24 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 6e972f198..2e166c529 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -2,7 +2,7 @@ import guru.springframework.spring6restmvc.model.Beer; import guru.springframework.spring6restmvc.services.BeerService; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -16,7 +16,7 @@ * Created by jt, Spring Framework Guru. */ @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor @RestController @RequestMapping("/api/v1/beer") public class BeerController { diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 114e81bcd..381786a1d 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -1,23 +1,31 @@ package guru.springframework.spring6restmvc.controller; +import guru.springframework.spring6restmvc.services.BeerService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@SpringBootTest +@WebMvcTest(BeerController.class) class BeerControllerTest { @Autowired - BeerController beerController; + MockMvc mockMvc; - @Test - void getBeerById() { - - System.out.println(beerController.getBeerById(UUID.randomUUID())); + @MockBean + BeerService beerService; + @Test + void getBeerById() throws Exception { + mockMvc.perform(get("/api/v1/beer/" + UUID.randomUUID()) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); } } \ No newline at end of file From 88294531e2f0ba74881b4f04f2a20ea96f3087c4 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 8 Aug 2022 16:17:19 -0400 Subject: [PATCH 018/114] adding mockito config --- .../controller/BeerControllerTest.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 381786a1d..9e35fdc1c 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -1,6 +1,8 @@ package guru.springframework.spring6restmvc.controller; +import guru.springframework.spring6restmvc.model.Beer; import guru.springframework.spring6restmvc.services.BeerService; +import guru.springframework.spring6restmvc.services.BeerServiceImpl; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -10,7 +12,10 @@ import java.util.UUID; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(BeerController.class) @@ -22,10 +27,17 @@ class BeerControllerTest { @MockBean BeerService beerService; + BeerServiceImpl beerServiceImpl = new BeerServiceImpl(); + @Test void getBeerById() throws Exception { + Beer testBeer = beerServiceImpl.listBeers().get(0); + + given(beerService.getBeerById(any(UUID.class))).willReturn(testBeer); + mockMvc.perform(get("/api/v1/beer/" + UUID.randomUUID()) .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)); } } \ No newline at end of file From 8ac01cad9f6a38fcf127e9f7cccec892cc8d3f3a Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 8 Aug 2022 16:29:37 -0400 Subject: [PATCH 019/114] adding json path matchers example --- .../controller/BeerControllerTest.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 9e35fdc1c..9913c8149 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -10,13 +10,10 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import java.util.UUID; - -import static org.mockito.ArgumentMatchers.any; +import static org.hamcrest.core.Is.is; import static org.mockito.BDDMockito.given; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(BeerController.class) class BeerControllerTest { @@ -33,11 +30,13 @@ class BeerControllerTest { void getBeerById() throws Exception { Beer testBeer = beerServiceImpl.listBeers().get(0); - given(beerService.getBeerById(any(UUID.class))).willReturn(testBeer); + given(beerService.getBeerById(testBeer.getId())).willReturn(testBeer); - mockMvc.perform(get("/api/v1/beer/" + UUID.randomUUID()) + mockMvc.perform(get("/api/v1/beer/" + testBeer.getId()) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON)); + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.id", is(testBeer.getId().toString()))) + .andExpect(jsonPath("$.beerName", is(testBeer.getBeerName()))); } } \ No newline at end of file From 499023b806af77b64dc99cf7a57e9fbe1d7b7a6d Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 09:53:09 -0400 Subject: [PATCH 020/114] adding test for list beers --- .../spring6restmvc/controller/BeerControllerTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 9913c8149..f7d99c885 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -26,6 +26,17 @@ class BeerControllerTest { BeerServiceImpl beerServiceImpl = new BeerServiceImpl(); + @Test + void testListBeers() throws Exception { + given(beerService.listBeers()).willReturn(beerServiceImpl.listBeers()); + + mockMvc.perform(get("/api/v1/beer") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.length()", is(3))); + } + @Test void getBeerById() throws Exception { Beer testBeer = beerServiceImpl.listBeers().get(0); From aa73d06683daa4322525c2ba1183cccd10b6c0f2 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 10:49:37 -0400 Subject: [PATCH 021/114] adding tests for customer --- .../controller/CustomerControllerTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java new file mode 100644 index 000000000..78e89f326 --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -0,0 +1,63 @@ +package guru.springframework.spring6restmvc.controller; + +import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.services.CustomerService; +import guru.springframework.spring6restmvc.services.CustomerServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.hamcrest.core.Is.is; +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(CustomerController.class) +class CustomerControllerTest { + + @MockBean + CustomerService customerService; + + @Autowired + MockMvc mockMvc; + + CustomerServiceImpl customerServiceImpl = new CustomerServiceImpl(); + + @Test + void listAllCustomers() throws Exception { + given(customerService.getAllCustomers()).willReturn(customerServiceImpl.getAllCustomers()); + + mockMvc.perform(get("/api/v1/customer") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.length()", is(3))); + } + + @Test + void getCustomerById() throws Exception { + Customer customer = customerServiceImpl.getAllCustomers().get(0); + + given(customerService.getCustomerById(customer.getId())).willReturn(customer); + + mockMvc.perform(get("/api/v1/customer/" + customer.getId()) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.name", is(customer.getName()))); + + } +} + + + + + + + + + + From bafde8bea0cc819e37eb604c409c4c09620fab1d Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 12:29:16 -0400 Subject: [PATCH 022/114] adding jackson example --- .../controller/BeerControllerTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index f7d99c885..198526210 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -1,5 +1,7 @@ package guru.springframework.spring6restmvc.controller; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import guru.springframework.spring6restmvc.model.Beer; import guru.springframework.spring6restmvc.services.BeerService; import guru.springframework.spring6restmvc.services.BeerServiceImpl; @@ -21,11 +23,22 @@ class BeerControllerTest { @Autowired MockMvc mockMvc; + @Autowired + ObjectMapper objectMapper; + @MockBean BeerService beerService; BeerServiceImpl beerServiceImpl = new BeerServiceImpl(); + @Test + void testCreateNewBeer() throws JsonProcessingException { + Beer beer = beerServiceImpl.listBeers().get(0); + + System.out.println(objectMapper.writeValueAsString(beer)); + + } + @Test void testListBeers() throws Exception { given(beerService.listBeers()).willReturn(beerServiceImpl.listBeers()); From d3873e7ff0c635a04260f942e5834f7e5ebbe912 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 15:21:25 -0400 Subject: [PATCH 023/114] adding create beer test --- .../controller/BeerControllerTest.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 198526210..67c1dcfa7 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -1,10 +1,10 @@ package guru.springframework.spring6restmvc.controller; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import guru.springframework.spring6restmvc.model.Beer; import guru.springframework.spring6restmvc.services.BeerService; import guru.springframework.spring6restmvc.services.BeerServiceImpl; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -13,8 +13,10 @@ import org.springframework.test.web.servlet.MockMvc; import static org.hamcrest.core.Is.is; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(BeerController.class) @@ -29,14 +31,27 @@ class BeerControllerTest { @MockBean BeerService beerService; - BeerServiceImpl beerServiceImpl = new BeerServiceImpl(); + BeerServiceImpl beerServiceImpl; + + @BeforeEach + void setUp() { + beerServiceImpl = new BeerServiceImpl(); + } @Test - void testCreateNewBeer() throws JsonProcessingException { + void testCreateNewBeer() throws Exception { Beer beer = beerServiceImpl.listBeers().get(0); + beer.setVersion(null); + beer.setId(null); - System.out.println(objectMapper.writeValueAsString(beer)); + given(beerService.saveNewBeer(any(Beer.class))).willReturn(beerServiceImpl.listBeers().get(1)); + mockMvc.perform(post("/api/v1/beer") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(beer))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")); } @Test From 40e5119df80d9730e89ab1ae390fe5f37f7f2d41 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 15:42:58 -0400 Subject: [PATCH 024/114] adding test for create customer --- .../controller/CustomerControllerTest.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 78e89f326..0658f552d 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -1,8 +1,10 @@ package guru.springframework.spring6restmvc.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import guru.springframework.spring6restmvc.model.Customer; import guru.springframework.spring6restmvc.services.CustomerService; import guru.springframework.spring6restmvc.services.CustomerServiceImpl; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -11,8 +13,10 @@ import org.springframework.test.web.servlet.MockMvc; import static org.hamcrest.core.Is.is; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(CustomerController.class) @@ -24,7 +28,31 @@ class CustomerControllerTest { @Autowired MockMvc mockMvc; - CustomerServiceImpl customerServiceImpl = new CustomerServiceImpl(); + @Autowired + ObjectMapper objectMapper; + + CustomerServiceImpl customerServiceImpl; + + @BeforeEach + void setUp() { + customerServiceImpl = new CustomerServiceImpl(); + } + + @Test + void testCreatCustomer() throws Exception { + Customer customer = customerServiceImpl.getAllCustomers().get(0); + customer.setId(null); + customer.setVersion(null); + + given(customerService.saveNewCustomer(any(Customer.class))) + .willReturn(customerServiceImpl.getAllCustomers().get(1)); + + mockMvc.perform(post("/api/v1/customer").contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(customer))) + .andExpect(status().isCreated()) + .andExpect(header().exists("Location")); + } @Test void listAllCustomers() throws Exception { From 5b664a1c66a5eb4973c119a00ba98b2f32a70dc9 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 16:06:56 -0400 Subject: [PATCH 025/114] adding test for update of beer --- .../controller/BeerControllerTest.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 67c1dcfa7..c6cfdb809 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -12,11 +12,13 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import java.util.UUID; + import static org.hamcrest.core.Is.is; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(BeerController.class) @@ -38,6 +40,19 @@ void setUp() { beerServiceImpl = new BeerServiceImpl(); } + @Test + void testUpdateBeer() throws Exception { + Beer beer = beerServiceImpl.listBeers().get(0); + + mockMvc.perform(put("/api/v1/beer/" + beer.getId()) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(beer))) + .andExpect(status().isNoContent()); + + verify(beerService).updateBeerById(any(UUID.class), any(Beer.class)); + } + @Test void testCreateNewBeer() throws Exception { Beer beer = beerServiceImpl.listBeers().get(0); From 50aabd3e67eb97e39e38b8afe348b9308ab88e57 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 16:26:40 -0400 Subject: [PATCH 026/114] adding test for update of customer --- .../controller/CustomerControllerTest.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 0658f552d..843c2edf1 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -12,11 +12,13 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import java.util.UUID; + import static org.hamcrest.core.Is.is; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(CustomerController.class) @@ -39,7 +41,20 @@ void setUp() { } @Test - void testCreatCustomer() throws Exception { + void testUpdateCustomer() throws Exception { + Customer customer = customerServiceImpl.getAllCustomers().get(0); + + mockMvc.perform(put("/api/v1/customer/" + customer.getId()) + .content(objectMapper.writeValueAsString(customer)) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + verify(customerService).updateCustomerById(any(UUID.class), any(Customer.class)); + } + + @Test + void testCreateCustomer() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); customer.setId(null); customer.setVersion(null); From 4c2db428e55fb49a58e597c0c54b138f265b599f Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 16:44:30 -0400 Subject: [PATCH 027/114] adding test for delete beer --- .../controller/BeerControllerTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index c6cfdb809..785df820d 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -6,6 +6,7 @@ import guru.springframework.spring6restmvc.services.BeerServiceImpl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -14,6 +15,7 @@ import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.core.Is.is; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; @@ -40,6 +42,20 @@ void setUp() { beerServiceImpl = new BeerServiceImpl(); } + @Test + void testDeleteBeer() throws Exception { + Beer beer = beerServiceImpl.listBeers().get(0); + + mockMvc.perform(delete("/api/v1/beer/" + beer.getId()) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + ArgumentCaptor uuidArgumentCaptor = ArgumentCaptor.forClass(UUID.class); + verify(beerService).deleteById(uuidArgumentCaptor.capture()); + + assertThat(beer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); + } + @Test void testUpdateBeer() throws Exception { Beer beer = beerServiceImpl.listBeers().get(0); From acd869d4ea47782a70fbf90451fce598556f6745 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 10 Aug 2022 09:30:06 -0400 Subject: [PATCH 028/114] adding test for delete customer --- .../controller/CustomerControllerTest.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 843c2edf1..53ce8d387 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -6,6 +6,8 @@ import guru.springframework.spring6restmvc.services.CustomerServiceImpl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -14,6 +16,7 @@ import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.core.Is.is; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; @@ -40,6 +43,22 @@ void setUp() { customerServiceImpl = new CustomerServiceImpl(); } + @Captor + ArgumentCaptor uuidArgumentCaptor; + + @Test + void testDeleteCustomer() throws Exception { + Customer customer = customerServiceImpl.getAllCustomers().get(0); + + mockMvc.perform(delete("/api/v1/customer/" + customer.getId()) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + verify(customerService).deleteCustomerById(uuidArgumentCaptor.capture()); + + assertThat(customer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); + } + @Test void testUpdateCustomer() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); @@ -50,7 +69,9 @@ void testUpdateCustomer() throws Exception { .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - verify(customerService).updateCustomerById(any(UUID.class), any(Customer.class)); + verify(customerService).updateCustomerById(uuidArgumentCaptor.capture(), any(Customer.class)); + + assertThat(customer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); } @Test From 725626f353e842624d586eb7e6681728e7588a78 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 10 Aug 2022 10:55:28 -0400 Subject: [PATCH 029/114] adding test of Patch beer --- .../controller/BeerControllerTest.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 785df820d..981e3ed9e 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -7,12 +7,15 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -37,11 +40,36 @@ class BeerControllerTest { BeerServiceImpl beerServiceImpl; + @Captor + ArgumentCaptor uuidArgumentCaptor; + + @Captor + ArgumentCaptor beerArgumentCaptor; + @BeforeEach void setUp() { beerServiceImpl = new BeerServiceImpl(); } + @Test + void testPatchBeer() throws Exception { + Beer beer = beerServiceImpl.listBeers().get(0); + + Map beerMap = new HashMap<>(); + beerMap.put("beerName", "New Name"); + + mockMvc.perform(patch("/api/v1/beer/" + beer.getId()) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(beerMap))) + .andExpect(status().isNoContent()); + + verify(beerService).patchBeerById(uuidArgumentCaptor.capture(), beerArgumentCaptor.capture()); + + assertThat(beer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); + assertThat(beerMap.get("beerName")).isEqualTo(beerArgumentCaptor.getValue().getBeerName()); + } + @Test void testDeleteBeer() throws Exception { Beer beer = beerServiceImpl.listBeers().get(0); @@ -50,7 +78,6 @@ void testDeleteBeer() throws Exception { .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - ArgumentCaptor uuidArgumentCaptor = ArgumentCaptor.forClass(UUID.class); verify(beerService).deleteById(uuidArgumentCaptor.capture()); assertThat(beer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); From c00133d8beece6babd9c9fdb608efa610e5fed74 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 10 Aug 2022 16:17:11 -0400 Subject: [PATCH 030/114] adding test of Patch customer --- .../spring6restmvc/controller/CustomerController.java | 9 +++++++++ .../spring6restmvc/services/CustomerService.java | 2 ++ .../spring6restmvc/services/CustomerServiceImpl.java | 10 ++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index a65a219de..0799c5a47 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -21,6 +21,15 @@ public class CustomerController { private final CustomerService customerService; + @PatchMapping("{customerId}") + public ResponseEntity patchCustomerById(@PathVariable("customerId") UUID customerId, + @RequestBody Customer customer){ + + customerService.patchCustomerById(customerId, customer); + + return new ResponseEntity(HttpStatus.NO_CONTENT); + } + @DeleteMapping("{customerId}") public ResponseEntity deleteCustomerById(@PathVariable("customerId") UUID customerId){ diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java index f09824e4e..70eaaca19 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -19,4 +19,6 @@ public interface CustomerService { void updateCustomerById(UUID customerId, Customer customer); void deleteCustomerById(UUID customerId); + + void patchCustomerById(UUID customerId, Customer customer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java index 9e3aad909..587d74ea2 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -2,6 +2,7 @@ import guru.springframework.spring6restmvc.model.Customer; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.time.LocalDateTime; import java.util.*; @@ -45,6 +46,15 @@ public CustomerServiceImpl() { customerMap.put(customer3.getId(), customer3); } + @Override + public void patchCustomerById(UUID customerId, Customer customer) { + Customer existing = customerMap.get(customerId); + + if (StringUtils.hasText(customer.getName())) { + existing.setName(customer.getName()); + } + } + @Override public void deleteCustomerById(UUID customerId) { customerMap.remove(customerId); From 421246e7fe9e57f21392872de50904d826081482 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 11 Aug 2022 09:24:25 -0400 Subject: [PATCH 031/114] adding test of patch customer --- .../controller/CustomerControllerTest.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 53ce8d387..8577bc516 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -14,6 +14,8 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -46,6 +48,29 @@ void setUp() { @Captor ArgumentCaptor uuidArgumentCaptor; + @Captor + ArgumentCaptor customerArgumentCaptor; + + @Test + void testPatchCustomer() throws Exception { + Customer customer = customerServiceImpl.getAllCustomers().get(0); + + Map customerMap = new HashMap<>(); + customerMap.put("name", "New Name"); + + mockMvc.perform(patch("/api/v1/customer/" + customer.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(customerMap))) + .andExpect(status().isNoContent()); + + verify(customerService).patchCustomerById(uuidArgumentCaptor.capture(), + customerArgumentCaptor.capture()); + + assertThat(uuidArgumentCaptor.getValue()).isEqualTo(customer.getId()); + assertThat(customerArgumentCaptor.getValue().getName()) + .isEqualTo(customerMap.get("name")); + } + @Test void testDeleteCustomer() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); @@ -54,7 +79,8 @@ void testDeleteCustomer() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - verify(customerService).deleteCustomerById(uuidArgumentCaptor.capture()); + verify(customerService).patchCustomerById(uuidArgumentCaptor.capture(), + customerArgumentCaptor.capture()); assertThat(customer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); } From f2d5fc3afbc90c53e6c37743fe1f486df61566b0 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 11 Aug 2022 12:29:20 -0400 Subject: [PATCH 032/114] refactoring to constants for URLs --- .../controller/BeerController.java | 20 ++++++++++--------- .../controller/CustomerController.java | 18 +++++++++-------- .../controller/BeerControllerTest.java | 12 +++++------ .../controller/CustomerControllerTest.java | 15 +++++++------- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 2e166c529..fd3b7d701 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -18,11 +18,14 @@ @Slf4j @RequiredArgsConstructor @RestController -@RequestMapping("/api/v1/beer") public class BeerController { + + public static final String BEER_PATH = "/api/v1/beer"; + public static final String BEER_PATH_ID = BEER_PATH + "/{beerId}"; + private final BeerService beerService; - @PatchMapping("{beerId}") + @PatchMapping(BEER_PATH_ID) public ResponseEntity updateBeerPatchById(@PathVariable("beerId")UUID beerId, @RequestBody Beer beer){ beerService.patchBeerById(beerId, beer); @@ -30,7 +33,7 @@ public ResponseEntity updateBeerPatchById(@PathVariable("beerId")UUID beerId, @R return new ResponseEntity(HttpStatus.NO_CONTENT); } - @DeleteMapping("{beerId}") + @DeleteMapping(BEER_PATH_ID) public ResponseEntity deleteById(@PathVariable("beerId") UUID beerId){ beerService.deleteById(beerId); @@ -38,7 +41,7 @@ public ResponseEntity deleteById(@PathVariable("beerId") UUID beerId){ return new ResponseEntity(HttpStatus.NO_CONTENT); } - @PutMapping("{beerId}") + @PutMapping(BEER_PATH_ID) public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBody Beer beer){ beerService.updateBeerById(beerId, beer); @@ -46,24 +49,23 @@ public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBod return new ResponseEntity(HttpStatus.NO_CONTENT); } - @PostMapping - //@RequestMapping(method = RequestMethod.POST) + @PostMapping(BEER_PATH) public ResponseEntity handlePost(@RequestBody Beer beer){ Beer savedBeer = beerService.saveNewBeer(beer); HttpHeaders headers = new HttpHeaders(); - headers.add("Location", "/api/v1/beer/" + savedBeer.getId().toString()); + headers.add("Location", BEER_PATH + "/" + savedBeer.getId().toString()); return new ResponseEntity(headers, HttpStatus.CREATED); } - @RequestMapping(method = RequestMethod.GET) + @GetMapping(value = BEER_PATH) public List listBeers(){ return beerService.listBeers(); } - @RequestMapping(value = "{beerId}", method = RequestMethod.GET) + @GetMapping(value = BEER_PATH_ID) public Beer getBeerById(@PathVariable("beerId") UUID beerId){ log.debug("Get Beer by Id - in controller"); diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index 0799c5a47..19a465f49 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -14,14 +14,16 @@ /** * Created by jt, Spring Framework Guru. */ -@RequestMapping("/api/v1/customer") + @RequiredArgsConstructor @RestController public class CustomerController { + public static final String CUSTOMER_PATH = "/api/v1/customer"; + public static final String CUSTOMER_PATH_ID = CUSTOMER_PATH + "/{customerId}"; private final CustomerService customerService; - @PatchMapping("{customerId}") + @PatchMapping(CUSTOMER_PATH_ID) public ResponseEntity patchCustomerById(@PathVariable("customerId") UUID customerId, @RequestBody Customer customer){ @@ -30,7 +32,7 @@ public ResponseEntity patchCustomerById(@PathVariable("customerId") UUID custome return new ResponseEntity(HttpStatus.NO_CONTENT); } - @DeleteMapping("{customerId}") + @DeleteMapping(CUSTOMER_PATH_ID) public ResponseEntity deleteCustomerById(@PathVariable("customerId") UUID customerId){ customerService.deleteCustomerById(customerId); @@ -38,7 +40,7 @@ public ResponseEntity deleteCustomerById(@PathVariable("customerId") UUID custom return new ResponseEntity(HttpStatus.NO_CONTENT); } - @PutMapping("{customerId}") + @PutMapping(CUSTOMER_PATH_ID) public ResponseEntity updateCustomerByID(@PathVariable("customerId") UUID customerId, @RequestBody Customer customer){ @@ -47,22 +49,22 @@ public ResponseEntity updateCustomerByID(@PathVariable("customerId") UUID custom return new ResponseEntity(HttpStatus.NO_CONTENT); } - @PostMapping + @PostMapping(CUSTOMER_PATH) public ResponseEntity handlePost(@RequestBody Customer customer){ Customer savedCustomer = customerService.saveNewCustomer(customer); HttpHeaders headers = new HttpHeaders(); - headers.add("Location", "/api/v1/customer/" + savedCustomer.getId().toString()); + headers.add("Location", CUSTOMER_PATH + "/" + savedCustomer.getId().toString()); return new ResponseEntity(headers, HttpStatus.CREATED); } - @RequestMapping(method = RequestMethod.GET) + @GetMapping(CUSTOMER_PATH) public List listAllCustomers(){ return customerService.getAllCustomers(); } - @RequestMapping(value = "{customerId}", method = RequestMethod.GET) + @GetMapping(value = CUSTOMER_PATH_ID) public Customer getCustomerById(@PathVariable("customerId") UUID id){ return customerService.getCustomerById(id); } diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 981e3ed9e..402e76281 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -58,7 +58,7 @@ void testPatchBeer() throws Exception { Map beerMap = new HashMap<>(); beerMap.put("beerName", "New Name"); - mockMvc.perform(patch("/api/v1/beer/" + beer.getId()) + mockMvc.perform(patch(BeerController.BEER_PATH + "/" + beer.getId()) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beerMap))) @@ -74,7 +74,7 @@ void testPatchBeer() throws Exception { void testDeleteBeer() throws Exception { Beer beer = beerServiceImpl.listBeers().get(0); - mockMvc.perform(delete("/api/v1/beer/" + beer.getId()) + mockMvc.perform(delete(BeerController.BEER_PATH + "/"+ beer.getId()) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); @@ -87,7 +87,7 @@ void testDeleteBeer() throws Exception { void testUpdateBeer() throws Exception { Beer beer = beerServiceImpl.listBeers().get(0); - mockMvc.perform(put("/api/v1/beer/" + beer.getId()) + mockMvc.perform(put(BeerController.BEER_PATH + "/" + beer.getId()) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beer))) @@ -104,7 +104,7 @@ void testCreateNewBeer() throws Exception { given(beerService.saveNewBeer(any(Beer.class))).willReturn(beerServiceImpl.listBeers().get(1)); - mockMvc.perform(post("/api/v1/beer") + mockMvc.perform(post(BeerController.BEER_PATH) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beer))) @@ -116,7 +116,7 @@ void testCreateNewBeer() throws Exception { void testListBeers() throws Exception { given(beerService.listBeers()).willReturn(beerServiceImpl.listBeers()); - mockMvc.perform(get("/api/v1/beer") + mockMvc.perform(get(BeerController.BEER_PATH) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) @@ -129,7 +129,7 @@ void getBeerById() throws Exception { given(beerService.getBeerById(testBeer.getId())).willReturn(testBeer); - mockMvc.perform(get("/api/v1/beer/" + testBeer.getId()) + mockMvc.perform(get(BeerController.BEER_PATH + "/"+ testBeer.getId()) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 8577bc516..3ee2a2d01 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -58,7 +58,7 @@ void testPatchCustomer() throws Exception { Map customerMap = new HashMap<>(); customerMap.put("name", "New Name"); - mockMvc.perform(patch("/api/v1/customer/" + customer.getId()) + mockMvc.perform(patch( CustomerController.CUSTOMER_PATH + "/" + customer.getId()) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(customerMap))) .andExpect(status().isNoContent()); @@ -75,12 +75,11 @@ void testPatchCustomer() throws Exception { void testDeleteCustomer() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); - mockMvc.perform(delete("/api/v1/customer/" + customer.getId()) + mockMvc.perform(delete(CustomerController.CUSTOMER_PATH + "/" + customer.getId()) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - verify(customerService).patchCustomerById(uuidArgumentCaptor.capture(), - customerArgumentCaptor.capture()); + verify(customerService).deleteCustomerById(uuidArgumentCaptor.capture()); assertThat(customer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); } @@ -89,7 +88,7 @@ void testDeleteCustomer() throws Exception { void testUpdateCustomer() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); - mockMvc.perform(put("/api/v1/customer/" + customer.getId()) + mockMvc.perform(put(CustomerController.CUSTOMER_PATH+ "/" + customer.getId()) .content(objectMapper.writeValueAsString(customer)) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) @@ -109,7 +108,7 @@ void testCreateCustomer() throws Exception { given(customerService.saveNewCustomer(any(Customer.class))) .willReturn(customerServiceImpl.getAllCustomers().get(1)); - mockMvc.perform(post("/api/v1/customer").contentType(MediaType.APPLICATION_JSON) + mockMvc.perform(post(CustomerController.CUSTOMER_PATH).contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(customer))) .andExpect(status().isCreated()) @@ -120,7 +119,7 @@ void testCreateCustomer() throws Exception { void listAllCustomers() throws Exception { given(customerService.getAllCustomers()).willReturn(customerServiceImpl.getAllCustomers()); - mockMvc.perform(get("/api/v1/customer") + mockMvc.perform(get(CustomerController.CUSTOMER_PATH) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) @@ -133,7 +132,7 @@ void getCustomerById() throws Exception { given(customerService.getCustomerById(customer.getId())).willReturn(customer); - mockMvc.perform(get("/api/v1/customer/" + customer.getId()) + mockMvc.perform(get(CustomerController.CUSTOMER_PATH + "/" + customer.getId()) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) From bfb60ae4adfa6287c63bb9eab29b28684b45ae42 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 11 Aug 2022 12:41:49 -0400 Subject: [PATCH 033/114] refactor to use URI builder --- .../spring6restmvc/controller/BeerControllerTest.java | 8 ++++---- .../controller/CustomerControllerTest.java | 9 ++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 402e76281..07e473ee6 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -58,7 +58,7 @@ void testPatchBeer() throws Exception { Map beerMap = new HashMap<>(); beerMap.put("beerName", "New Name"); - mockMvc.perform(patch(BeerController.BEER_PATH + "/" + beer.getId()) + mockMvc.perform(patch(BeerController.BEER_PATH_ID, beer.getId()) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beerMap))) @@ -74,7 +74,7 @@ void testPatchBeer() throws Exception { void testDeleteBeer() throws Exception { Beer beer = beerServiceImpl.listBeers().get(0); - mockMvc.perform(delete(BeerController.BEER_PATH + "/"+ beer.getId()) + mockMvc.perform(delete(BeerController.BEER_PATH_ID, beer.getId()) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); @@ -87,7 +87,7 @@ void testDeleteBeer() throws Exception { void testUpdateBeer() throws Exception { Beer beer = beerServiceImpl.listBeers().get(0); - mockMvc.perform(put(BeerController.BEER_PATH + "/" + beer.getId()) + mockMvc.perform(put(BeerController.BEER_PATH_ID, beer.getId()) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beer))) @@ -129,7 +129,7 @@ void getBeerById() throws Exception { given(beerService.getBeerById(testBeer.getId())).willReturn(testBeer); - mockMvc.perform(get(BeerController.BEER_PATH + "/"+ testBeer.getId()) + mockMvc.perform(get(BeerController.BEER_PATH_ID, testBeer.getId()) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 3ee2a2d01..9c602fd18 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -58,7 +58,7 @@ void testPatchCustomer() throws Exception { Map customerMap = new HashMap<>(); customerMap.put("name", "New Name"); - mockMvc.perform(patch( CustomerController.CUSTOMER_PATH + "/" + customer.getId()) + mockMvc.perform(patch( CustomerController.CUSTOMER_PATH_ID, customer.getId()) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(customerMap))) .andExpect(status().isNoContent()); @@ -75,7 +75,7 @@ void testPatchCustomer() throws Exception { void testDeleteCustomer() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); - mockMvc.perform(delete(CustomerController.CUSTOMER_PATH + "/" + customer.getId()) + mockMvc.perform(delete(CustomerController.CUSTOMER_PATH_ID, customer.getId()) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); @@ -88,7 +88,7 @@ void testDeleteCustomer() throws Exception { void testUpdateCustomer() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); - mockMvc.perform(put(CustomerController.CUSTOMER_PATH+ "/" + customer.getId()) + mockMvc.perform(put(CustomerController.CUSTOMER_PATH_ID, customer.getId()) .content(objectMapper.writeValueAsString(customer)) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) @@ -132,12 +132,11 @@ void getCustomerById() throws Exception { given(customerService.getCustomerById(customer.getId())).willReturn(customer); - mockMvc.perform(get(CustomerController.CUSTOMER_PATH + "/" + customer.getId()) + mockMvc.perform(get(CustomerController.CUSTOMER_PATH_ID, customer.getId()) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.name", is(customer.getName()))); - } } From 40c056ba8ba09e11e42c09eb659cb47919259be5 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Fri, 12 Aug 2022 11:04:22 -0400 Subject: [PATCH 034/114] adding custom exception --- .../controller/NotFoundException.java | 25 +++++++++++++++++++ .../controller/BeerControllerTest.java | 9 +++++++ 2 files changed, 34 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/controller/NotFoundException.java diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/NotFoundException.java b/src/main/java/guru/springframework/spring6restmvc/controller/NotFoundException.java new file mode 100644 index 000000000..39d78efdd --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/controller/NotFoundException.java @@ -0,0 +1,25 @@ +package guru.springframework.spring6restmvc.controller; + +/** + * Created by jt, Spring Framework Guru. + */ +public class NotFoundException extends RuntimeException { + public NotFoundException() { + } + + public NotFoundException(String message) { + super(message); + } + + public NotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public NotFoundException(Throwable cause) { + super(cause); + } + + public NotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 07e473ee6..77670cb1c 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -123,6 +123,15 @@ void testListBeers() throws Exception { .andExpect(jsonPath("$.length()", is(3))); } + @Test + void getBeerByIdNotFound() throws Exception { + + given(beerService.getBeerById(any(UUID.class))).willThrow(NotFoundException.class); + + mockMvc.perform(get(BeerController.BEER_PATH_ID, UUID.randomUUID())) + .andExpect(status().isNotFound()); + } + @Test void getBeerById() throws Exception { Beer testBeer = beerServiceImpl.listBeers().get(0); From 9202591336370d9d8af90cf12704697ce1837a91 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Fri, 12 Aug 2022 11:11:53 -0400 Subject: [PATCH 035/114] adding exception handler --- .../spring6restmvc/controller/BeerController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index fd3b7d701..3288d2643 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -65,6 +65,11 @@ public List listBeers(){ return beerService.listBeers(); } + @ExceptionHandler(NotFoundException.class) + public ResponseEntity handleNotFoundException(){ + return ResponseEntity.notFound().build(); + } + @GetMapping(value = BEER_PATH_ID) public Beer getBeerById(@PathVariable("beerId") UUID beerId){ From aad87dc032a3c09646af9c977bb84a865ca59dd0 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 10:56:19 -0400 Subject: [PATCH 036/114] adding controller advice example --- .../controller/BeerController.java | 4 ---- .../controller/ExceptionController.java | 16 ++++++++++++++++ .../controller/CustomerControllerTest.java | 9 +++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 src/main/java/guru/springframework/spring6restmvc/controller/ExceptionController.java diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 3288d2643..f2ab5c274 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -65,10 +65,6 @@ public List listBeers(){ return beerService.listBeers(); } - @ExceptionHandler(NotFoundException.class) - public ResponseEntity handleNotFoundException(){ - return ResponseEntity.notFound().build(); - } @GetMapping(value = BEER_PATH_ID) public Beer getBeerById(@PathVariable("beerId") UUID beerId){ diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/ExceptionController.java b/src/main/java/guru/springframework/spring6restmvc/controller/ExceptionController.java new file mode 100644 index 000000000..8faa44993 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/controller/ExceptionController.java @@ -0,0 +1,16 @@ +package guru.springframework.spring6restmvc.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +/** + * Created by jt, Spring Framework Guru. + */ +@ControllerAdvice +public class ExceptionController { + @ExceptionHandler(NotFoundException.class) + public ResponseEntity handleNotFoundException(){ + return ResponseEntity.notFound().build(); + } +} diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 9c602fd18..3d63e9d4e 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -126,6 +126,15 @@ void listAllCustomers() throws Exception { .andExpect(jsonPath("$.length()", is(3))); } + @Test + void getCustomerByIdNotFound() throws Exception { + + given(customerService.getCustomerById(any(UUID.class))).willThrow(NotFoundException.class); + + mockMvc.perform(get(CustomerController.CUSTOMER_PATH_ID, UUID.randomUUID())) + .andExpect(status().isNotFound()); + } + @Test void getCustomerById() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); From 642dd0afcb691e3780917a6b87c072e146025751 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 11:22:50 -0400 Subject: [PATCH 037/114] adding response status example --- .../controller/ExceptionController.java | 16 ---------------- .../controller/NotFoundException.java | 4 ++++ 2 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 src/main/java/guru/springframework/spring6restmvc/controller/ExceptionController.java diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/ExceptionController.java b/src/main/java/guru/springframework/spring6restmvc/controller/ExceptionController.java deleted file mode 100644 index 8faa44993..000000000 --- a/src/main/java/guru/springframework/spring6restmvc/controller/ExceptionController.java +++ /dev/null @@ -1,16 +0,0 @@ -package guru.springframework.spring6restmvc.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; - -/** - * Created by jt, Spring Framework Guru. - */ -@ControllerAdvice -public class ExceptionController { - @ExceptionHandler(NotFoundException.class) - public ResponseEntity handleNotFoundException(){ - return ResponseEntity.notFound().build(); - } -} diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/NotFoundException.java b/src/main/java/guru/springframework/spring6restmvc/controller/NotFoundException.java index 39d78efdd..07a666823 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/NotFoundException.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/NotFoundException.java @@ -1,8 +1,12 @@ package guru.springframework.spring6restmvc.controller; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + /** * Created by jt, Spring Framework Guru. */ +@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Value Not Found") public class NotFoundException extends RuntimeException { public NotFoundException() { } From 4aa44eb9786d1a45622a7ae53ead92e6898a4366 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 13:00:13 -0400 Subject: [PATCH 038/114] adding use of Optional --- .../spring6restmvc/controller/BeerController.java | 2 +- .../spring6restmvc/controller/CustomerController.java | 2 +- .../springframework/spring6restmvc/services/BeerService.java | 3 ++- .../spring6restmvc/services/BeerServiceImpl.java | 4 ++-- .../spring6restmvc/services/CustomerService.java | 3 ++- .../spring6restmvc/services/CustomerServiceImpl.java | 4 ++-- .../spring6restmvc/controller/BeerControllerTest.java | 5 +++-- .../spring6restmvc/controller/CustomerControllerTest.java | 5 +++-- 8 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index f2ab5c274..f01be9e31 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -71,7 +71,7 @@ public Beer getBeerById(@PathVariable("beerId") UUID beerId){ log.debug("Get Beer by Id - in controller"); - return beerService.getBeerById(beerId); + return beerService.getBeerById(beerId).orElseThrow(NotFoundException::new); } } diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index 19a465f49..c0e7b93a2 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -66,7 +66,7 @@ public List listAllCustomers(){ @GetMapping(value = CUSTOMER_PATH_ID) public Customer getCustomerById(@PathVariable("customerId") UUID id){ - return customerService.getCustomerById(id); + return customerService.getCustomerById(id).orElseThrow(NotFoundException::new); } } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index 426739d82..a90985931 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -3,6 +3,7 @@ import guru.springframework.spring6restmvc.model.Beer; import java.util.List; +import java.util.Optional; import java.util.UUID; /** @@ -12,7 +13,7 @@ public interface BeerService { List listBeers(); - Beer getBeerById(UUID id); + Optional getBeerById(UUID id); Beer saveNewBeer(Beer beer); diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index d1dcd4edf..6bb43a13b 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -108,11 +108,11 @@ public List listBeers(){ } @Override - public Beer getBeerById(UUID id) { + public Optional getBeerById(UUID id) { log.debug("Get Beer by Id - in service. Id: " + id.toString()); - return beerMap.get(id); + return Optional.of(beerMap.get(id)); } @Override diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java index 70eaaca19..a0c0dd084 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -3,6 +3,7 @@ import guru.springframework.spring6restmvc.model.Customer; import java.util.List; +import java.util.Optional; import java.util.UUID; /** @@ -10,7 +11,7 @@ */ public interface CustomerService { - Customer getCustomerById(UUID uuid); + Optional getCustomerById(UUID uuid); List getAllCustomers(); diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java index 587d74ea2..272404102 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -83,8 +83,8 @@ public Customer saveNewCustomer(Customer customer) { } @Override - public Customer getCustomerById(UUID uuid) { - return customerMap.get(uuid); + public Optional getCustomerById(UUID uuid) { + return Optional.of(customerMap.get(uuid)); } @Override diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 77670cb1c..2b4fe4bc1 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -16,6 +16,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -126,7 +127,7 @@ void testListBeers() throws Exception { @Test void getBeerByIdNotFound() throws Exception { - given(beerService.getBeerById(any(UUID.class))).willThrow(NotFoundException.class); + given(beerService.getBeerById(any(UUID.class))).willReturn(Optional.empty()); mockMvc.perform(get(BeerController.BEER_PATH_ID, UUID.randomUUID())) .andExpect(status().isNotFound()); @@ -136,7 +137,7 @@ void getBeerByIdNotFound() throws Exception { void getBeerById() throws Exception { Beer testBeer = beerServiceImpl.listBeers().get(0); - given(beerService.getBeerById(testBeer.getId())).willReturn(testBeer); + given(beerService.getBeerById(testBeer.getId())).willReturn(Optional.of(testBeer)); mockMvc.perform(get(BeerController.BEER_PATH_ID, testBeer.getId()) .accept(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 3d63e9d4e..6e94b031b 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -16,6 +16,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -129,7 +130,7 @@ void listAllCustomers() throws Exception { @Test void getCustomerByIdNotFound() throws Exception { - given(customerService.getCustomerById(any(UUID.class))).willThrow(NotFoundException.class); + given(customerService.getCustomerById(any(UUID.class))).willReturn(Optional.empty()); mockMvc.perform(get(CustomerController.CUSTOMER_PATH_ID, UUID.randomUUID())) .andExpect(status().isNotFound()); @@ -139,7 +140,7 @@ void getCustomerByIdNotFound() throws Exception { void getCustomerById() throws Exception { Customer customer = customerServiceImpl.getAllCustomers().get(0); - given(customerService.getCustomerById(customer.getId())).willReturn(customer); + given(customerService.getCustomerById(customer.getId())).willReturn(Optional.of(customer)); mockMvc.perform(get(CustomerController.CUSTOMER_PATH_ID, customer.getId()) .accept(MediaType.APPLICATION_JSON)) From e9862d2f39d0a9cea6204ccf2285cead407b7d5e Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 14:57:38 -0400 Subject: [PATCH 039/114] refactor to DTOs --- .../controller/BeerController.java | 14 +++++----- .../controller/CustomerController.java | 14 +++++----- .../model/{Beer.java => BeerDTO.java} | 2 +- .../model/{Customer.java => CustomerDTO.java} | 2 +- .../spring6restmvc/services/BeerService.java | 12 ++++----- .../services/BeerServiceImpl.java | 26 +++++++++---------- .../services/CustomerService.java | 12 ++++----- .../services/CustomerServiceImpl.java | 26 +++++++++---------- .../controller/BeerControllerTest.java | 18 ++++++------- .../controller/CustomerControllerTest.java | 18 ++++++------- 10 files changed, 72 insertions(+), 72 deletions(-) rename src/main/java/guru/springframework/spring6restmvc/model/{Beer.java => BeerDTO.java} (95%) rename src/main/java/guru/springframework/spring6restmvc/model/{Customer.java => CustomerDTO.java} (93%) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index f01be9e31..cd2ce77f4 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -1,6 +1,6 @@ package guru.springframework.spring6restmvc.controller; -import guru.springframework.spring6restmvc.model.Beer; +import guru.springframework.spring6restmvc.model.BeerDTO; import guru.springframework.spring6restmvc.services.BeerService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,7 +26,7 @@ public class BeerController { private final BeerService beerService; @PatchMapping(BEER_PATH_ID) - public ResponseEntity updateBeerPatchById(@PathVariable("beerId")UUID beerId, @RequestBody Beer beer){ + public ResponseEntity updateBeerPatchById(@PathVariable("beerId")UUID beerId, @RequestBody BeerDTO beer){ beerService.patchBeerById(beerId, beer); @@ -42,7 +42,7 @@ public ResponseEntity deleteById(@PathVariable("beerId") UUID beerId){ } @PutMapping(BEER_PATH_ID) - public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBody Beer beer){ + public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBody BeerDTO beer){ beerService.updateBeerById(beerId, beer); @@ -50,9 +50,9 @@ public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBod } @PostMapping(BEER_PATH) - public ResponseEntity handlePost(@RequestBody Beer beer){ + public ResponseEntity handlePost(@RequestBody BeerDTO beer){ - Beer savedBeer = beerService.saveNewBeer(beer); + BeerDTO savedBeer = beerService.saveNewBeer(beer); HttpHeaders headers = new HttpHeaders(); headers.add("Location", BEER_PATH + "/" + savedBeer.getId().toString()); @@ -61,13 +61,13 @@ public ResponseEntity handlePost(@RequestBody Beer beer){ } @GetMapping(value = BEER_PATH) - public List listBeers(){ + public List listBeers(){ return beerService.listBeers(); } @GetMapping(value = BEER_PATH_ID) - public Beer getBeerById(@PathVariable("beerId") UUID beerId){ + public BeerDTO getBeerById(@PathVariable("beerId") UUID beerId){ log.debug("Get Beer by Id - in controller"); diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index c0e7b93a2..6508178ac 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -1,6 +1,6 @@ package guru.springframework.spring6restmvc.controller; -import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.model.CustomerDTO; import guru.springframework.spring6restmvc.services.CustomerService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; @@ -25,7 +25,7 @@ public class CustomerController { @PatchMapping(CUSTOMER_PATH_ID) public ResponseEntity patchCustomerById(@PathVariable("customerId") UUID customerId, - @RequestBody Customer customer){ + @RequestBody CustomerDTO customer){ customerService.patchCustomerById(customerId, customer); @@ -42,7 +42,7 @@ public ResponseEntity deleteCustomerById(@PathVariable("customerId") UUID custom @PutMapping(CUSTOMER_PATH_ID) public ResponseEntity updateCustomerByID(@PathVariable("customerId") UUID customerId, - @RequestBody Customer customer){ + @RequestBody CustomerDTO customer){ customerService.updateCustomerById(customerId, customer); @@ -50,8 +50,8 @@ public ResponseEntity updateCustomerByID(@PathVariable("customerId") UUID custom } @PostMapping(CUSTOMER_PATH) - public ResponseEntity handlePost(@RequestBody Customer customer){ - Customer savedCustomer = customerService.saveNewCustomer(customer); + public ResponseEntity handlePost(@RequestBody CustomerDTO customer){ + CustomerDTO savedCustomer = customerService.saveNewCustomer(customer); HttpHeaders headers = new HttpHeaders(); headers.add("Location", CUSTOMER_PATH + "/" + savedCustomer.getId().toString()); @@ -60,12 +60,12 @@ public ResponseEntity handlePost(@RequestBody Customer customer){ } @GetMapping(CUSTOMER_PATH) - public List listAllCustomers(){ + public List listAllCustomers(){ return customerService.getAllCustomers(); } @GetMapping(value = CUSTOMER_PATH_ID) - public Customer getCustomerById(@PathVariable("customerId") UUID id){ + public CustomerDTO getCustomerById(@PathVariable("customerId") UUID id){ return customerService.getCustomerById(id).orElseThrow(NotFoundException::new); } diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Beer.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java similarity index 95% rename from src/main/java/guru/springframework/spring6restmvc/model/Beer.java rename to src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java index 1aed54c28..eee5ad954 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java @@ -12,7 +12,7 @@ */ @Builder @Data -public class Beer { +public class BeerDTO { private UUID id; private Integer version; private String beerName; diff --git a/src/main/java/guru/springframework/spring6restmvc/model/Customer.java b/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java similarity index 93% rename from src/main/java/guru/springframework/spring6restmvc/model/Customer.java rename to src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java index 195ae3e72..a77044fbe 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java @@ -11,7 +11,7 @@ */ @Data @Builder -public class Customer { +public class CustomerDTO { private String name; private UUID id; diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index a90985931..1db44edd7 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -1,6 +1,6 @@ package guru.springframework.spring6restmvc.services; -import guru.springframework.spring6restmvc.model.Beer; +import guru.springframework.spring6restmvc.model.BeerDTO; import java.util.List; import java.util.Optional; @@ -11,15 +11,15 @@ */ public interface BeerService { - List listBeers(); + List listBeers(); - Optional getBeerById(UUID id); + Optional getBeerById(UUID id); - Beer saveNewBeer(Beer beer); + BeerDTO saveNewBeer(BeerDTO beer); - void updateBeerById(UUID beerId, Beer beer); + void updateBeerById(UUID beerId, BeerDTO beer); void deleteById(UUID beerId); - void patchBeerById(UUID beerId, Beer beer); + void patchBeerById(UUID beerId, BeerDTO beer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index 6bb43a13b..3ace7743a 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -1,6 +1,6 @@ package guru.springframework.spring6restmvc.services; -import guru.springframework.spring6restmvc.model.Beer; +import guru.springframework.spring6restmvc.model.BeerDTO; import guru.springframework.spring6restmvc.model.BeerStyle; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -17,12 +17,12 @@ @Service public class BeerServiceImpl implements BeerService { - private Map beerMap; + private Map beerMap; public BeerServiceImpl() { this.beerMap = new HashMap<>(); - Beer beer1 = Beer.builder() + BeerDTO beer1 = BeerDTO.builder() .id(UUID.randomUUID()) .version(1) .beerName("Galaxy Cat") @@ -34,7 +34,7 @@ public BeerServiceImpl() { .updateDate(LocalDateTime.now()) .build(); - Beer beer2 = Beer.builder() + BeerDTO beer2 = BeerDTO.builder() .id(UUID.randomUUID()) .version(1) .beerName("Crank") @@ -46,7 +46,7 @@ public BeerServiceImpl() { .updateDate(LocalDateTime.now()) .build(); - Beer beer3 = Beer.builder() + BeerDTO beer3 = BeerDTO.builder() .id(UUID.randomUUID()) .version(1) .beerName("Sunshine City") @@ -64,8 +64,8 @@ public BeerServiceImpl() { } @Override - public void patchBeerById(UUID beerId, Beer beer) { - Beer existing = beerMap.get(beerId); + public void patchBeerById(UUID beerId, BeerDTO beer) { + BeerDTO existing = beerMap.get(beerId); if (StringUtils.hasText(beer.getBeerName())){ existing.setBeerName(beer.getBeerName()); @@ -94,8 +94,8 @@ public void deleteById(UUID beerId) { } @Override - public void updateBeerById(UUID beerId, Beer beer) { - Beer existing = beerMap.get(beerId); + public void updateBeerById(UUID beerId, BeerDTO beer) { + BeerDTO existing = beerMap.get(beerId); existing.setBeerName(beer.getBeerName()); existing.setPrice(beer.getPrice()); existing.setUpc(beer.getUpc()); @@ -103,12 +103,12 @@ public void updateBeerById(UUID beerId, Beer beer) { } @Override - public List listBeers(){ + public List listBeers(){ return new ArrayList<>(beerMap.values()); } @Override - public Optional getBeerById(UUID id) { + public Optional getBeerById(UUID id) { log.debug("Get Beer by Id - in service. Id: " + id.toString()); @@ -116,9 +116,9 @@ public Optional getBeerById(UUID id) { } @Override - public Beer saveNewBeer(Beer beer) { + public BeerDTO saveNewBeer(BeerDTO beer) { - Beer savedBeer = Beer.builder() + BeerDTO savedBeer = BeerDTO.builder() .id(UUID.randomUUID()) .version(1) .createdDate(LocalDateTime.now()) diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java index a0c0dd084..c4c2291cb 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -1,6 +1,6 @@ package guru.springframework.spring6restmvc.services; -import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.model.CustomerDTO; import java.util.List; import java.util.Optional; @@ -11,15 +11,15 @@ */ public interface CustomerService { - Optional getCustomerById(UUID uuid); + Optional getCustomerById(UUID uuid); - List getAllCustomers(); + List getAllCustomers(); - Customer saveNewCustomer(Customer customer); + CustomerDTO saveNewCustomer(CustomerDTO customer); - void updateCustomerById(UUID customerId, Customer customer); + void updateCustomerById(UUID customerId, CustomerDTO customer); void deleteCustomerById(UUID customerId); - void patchCustomerById(UUID customerId, Customer customer); + void patchCustomerById(UUID customerId, CustomerDTO customer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java index 272404102..671159fe3 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -1,6 +1,6 @@ package guru.springframework.spring6restmvc.services; -import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.model.CustomerDTO; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -13,10 +13,10 @@ @Service public class CustomerServiceImpl implements CustomerService { - private Map customerMap; + private Map customerMap; public CustomerServiceImpl() { - Customer customer1 = Customer.builder() + CustomerDTO customer1 = CustomerDTO.builder() .id(UUID.randomUUID()) .name("Customer 1") .version(1) @@ -24,7 +24,7 @@ public CustomerServiceImpl() { .updateDate(LocalDateTime.now()) .build(); - Customer customer2 = Customer.builder() + CustomerDTO customer2 = CustomerDTO.builder() .id(UUID.randomUUID()) .name("Customer 2") .version(1) @@ -32,7 +32,7 @@ public CustomerServiceImpl() { .updateDate(LocalDateTime.now()) .build(); - Customer customer3 = Customer.builder() + CustomerDTO customer3 = CustomerDTO.builder() .id(UUID.randomUUID()) .name("Customer 3") .version(1) @@ -47,8 +47,8 @@ public CustomerServiceImpl() { } @Override - public void patchCustomerById(UUID customerId, Customer customer) { - Customer existing = customerMap.get(customerId); + public void patchCustomerById(UUID customerId, CustomerDTO customer) { + CustomerDTO existing = customerMap.get(customerId); if (StringUtils.hasText(customer.getName())) { existing.setName(customer.getName()); @@ -61,15 +61,15 @@ public void deleteCustomerById(UUID customerId) { } @Override - public void updateCustomerById(UUID customerId, Customer customer) { - Customer existing = customerMap.get(customerId); + public void updateCustomerById(UUID customerId, CustomerDTO customer) { + CustomerDTO existing = customerMap.get(customerId); existing.setName(customer.getName()); } @Override - public Customer saveNewCustomer(Customer customer) { + public CustomerDTO saveNewCustomer(CustomerDTO customer) { - Customer savedCustomer = Customer.builder() + CustomerDTO savedCustomer = CustomerDTO.builder() .id(UUID.randomUUID()) .version(1) .updateDate(LocalDateTime.now()) @@ -83,12 +83,12 @@ public Customer saveNewCustomer(Customer customer) { } @Override - public Optional getCustomerById(UUID uuid) { + public Optional getCustomerById(UUID uuid) { return Optional.of(customerMap.get(uuid)); } @Override - public List getAllCustomers() { + public List getAllCustomers() { return new ArrayList<>(customerMap.values()); } } diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 2b4fe4bc1..3224fc46e 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -1,7 +1,7 @@ package guru.springframework.spring6restmvc.controller; import com.fasterxml.jackson.databind.ObjectMapper; -import guru.springframework.spring6restmvc.model.Beer; +import guru.springframework.spring6restmvc.model.BeerDTO; import guru.springframework.spring6restmvc.services.BeerService; import guru.springframework.spring6restmvc.services.BeerServiceImpl; import org.junit.jupiter.api.BeforeEach; @@ -45,7 +45,7 @@ class BeerControllerTest { ArgumentCaptor uuidArgumentCaptor; @Captor - ArgumentCaptor beerArgumentCaptor; + ArgumentCaptor beerArgumentCaptor; @BeforeEach void setUp() { @@ -54,7 +54,7 @@ void setUp() { @Test void testPatchBeer() throws Exception { - Beer beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers().get(0); Map beerMap = new HashMap<>(); beerMap.put("beerName", "New Name"); @@ -73,7 +73,7 @@ void testPatchBeer() throws Exception { @Test void testDeleteBeer() throws Exception { - Beer beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers().get(0); mockMvc.perform(delete(BeerController.BEER_PATH_ID, beer.getId()) .accept(MediaType.APPLICATION_JSON)) @@ -86,7 +86,7 @@ void testDeleteBeer() throws Exception { @Test void testUpdateBeer() throws Exception { - Beer beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers().get(0); mockMvc.perform(put(BeerController.BEER_PATH_ID, beer.getId()) .accept(MediaType.APPLICATION_JSON) @@ -94,16 +94,16 @@ void testUpdateBeer() throws Exception { .content(objectMapper.writeValueAsString(beer))) .andExpect(status().isNoContent()); - verify(beerService).updateBeerById(any(UUID.class), any(Beer.class)); + verify(beerService).updateBeerById(any(UUID.class), any(BeerDTO.class)); } @Test void testCreateNewBeer() throws Exception { - Beer beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers().get(0); beer.setVersion(null); beer.setId(null); - given(beerService.saveNewBeer(any(Beer.class))).willReturn(beerServiceImpl.listBeers().get(1)); + given(beerService.saveNewBeer(any(BeerDTO.class))).willReturn(beerServiceImpl.listBeers().get(1)); mockMvc.perform(post(BeerController.BEER_PATH) .accept(MediaType.APPLICATION_JSON) @@ -135,7 +135,7 @@ void getBeerByIdNotFound() throws Exception { @Test void getBeerById() throws Exception { - Beer testBeer = beerServiceImpl.listBeers().get(0); + BeerDTO testBeer = beerServiceImpl.listBeers().get(0); given(beerService.getBeerById(testBeer.getId())).willReturn(Optional.of(testBeer)); diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 6e94b031b..2e0c456bd 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -1,7 +1,7 @@ package guru.springframework.spring6restmvc.controller; import com.fasterxml.jackson.databind.ObjectMapper; -import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.model.CustomerDTO; import guru.springframework.spring6restmvc.services.CustomerService; import guru.springframework.spring6restmvc.services.CustomerServiceImpl; import org.junit.jupiter.api.BeforeEach; @@ -50,11 +50,11 @@ void setUp() { ArgumentCaptor uuidArgumentCaptor; @Captor - ArgumentCaptor customerArgumentCaptor; + ArgumentCaptor customerArgumentCaptor; @Test void testPatchCustomer() throws Exception { - Customer customer = customerServiceImpl.getAllCustomers().get(0); + CustomerDTO customer = customerServiceImpl.getAllCustomers().get(0); Map customerMap = new HashMap<>(); customerMap.put("name", "New Name"); @@ -74,7 +74,7 @@ void testPatchCustomer() throws Exception { @Test void testDeleteCustomer() throws Exception { - Customer customer = customerServiceImpl.getAllCustomers().get(0); + CustomerDTO customer = customerServiceImpl.getAllCustomers().get(0); mockMvc.perform(delete(CustomerController.CUSTOMER_PATH_ID, customer.getId()) .contentType(MediaType.APPLICATION_JSON)) @@ -87,7 +87,7 @@ void testDeleteCustomer() throws Exception { @Test void testUpdateCustomer() throws Exception { - Customer customer = customerServiceImpl.getAllCustomers().get(0); + CustomerDTO customer = customerServiceImpl.getAllCustomers().get(0); mockMvc.perform(put(CustomerController.CUSTOMER_PATH_ID, customer.getId()) .content(objectMapper.writeValueAsString(customer)) @@ -95,18 +95,18 @@ void testUpdateCustomer() throws Exception { .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - verify(customerService).updateCustomerById(uuidArgumentCaptor.capture(), any(Customer.class)); + verify(customerService).updateCustomerById(uuidArgumentCaptor.capture(), any(CustomerDTO.class)); assertThat(customer.getId()).isEqualTo(uuidArgumentCaptor.getValue()); } @Test void testCreateCustomer() throws Exception { - Customer customer = customerServiceImpl.getAllCustomers().get(0); + CustomerDTO customer = customerServiceImpl.getAllCustomers().get(0); customer.setId(null); customer.setVersion(null); - given(customerService.saveNewCustomer(any(Customer.class))) + given(customerService.saveNewCustomer(any(CustomerDTO.class))) .willReturn(customerServiceImpl.getAllCustomers().get(1)); mockMvc.perform(post(CustomerController.CUSTOMER_PATH).contentType(MediaType.APPLICATION_JSON) @@ -138,7 +138,7 @@ void getCustomerByIdNotFound() throws Exception { @Test void getCustomerById() throws Exception { - Customer customer = customerServiceImpl.getAllCustomers().get(0); + CustomerDTO customer = customerServiceImpl.getAllCustomers().get(0); given(customerService.getCustomerById(customer.getId())).willReturn(Optional.of(customer)); From bcd019acb4297fb2fc605a523886e81b2f0cfb72 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 15:09:58 -0400 Subject: [PATCH 040/114] adding Spring Data JPA Dependencies --- pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fce3dcb4c..08a988202 100644 --- a/pom.xml +++ b/pom.xml @@ -21,11 +21,18 @@ org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-devtools + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + org.projectlombok From df783b0e87dacedbb0c440b3ef2aabbd5cb3f2fa Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 15:39:30 -0400 Subject: [PATCH 041/114] adding JPA Entities --- .../spring6restmvc/entities/Beer.java | 36 +++++++++++++++++++ .../spring6restmvc/entities/Customer.java | 30 ++++++++++++++++ .../spring6restmvc/model/CustomerDTO.java | 3 +- 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/main/java/guru/springframework/spring6restmvc/entities/Beer.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/entities/Customer.java diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java new file mode 100644 index 000000000..bb54f46a4 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -0,0 +1,36 @@ +package guru.springframework.spring6restmvc.entities; + +import guru.springframework.spring6restmvc.model.BeerStyle; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Version; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Getter +@Setter +@Builder +@Entity +@NoArgsConstructor +@AllArgsConstructor +public class Beer { + + @Id + private UUID id; + + @Version + private Integer version; + private String beerName; + private BeerStyle beerStyle; + private String upc; + private Integer quantityOnHand; + private BigDecimal price; + private LocalDateTime createdDate; + private LocalDateTime updateDate; +} diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java new file mode 100644 index 000000000..905980bfe --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -0,0 +1,30 @@ +package guru.springframework.spring6restmvc.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Version; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Getter +@Setter +@Builder +@Entity +@AllArgsConstructor +@NoArgsConstructor +public class Customer { + + @Id + private UUID id; + private String name; + + @Version + private Integer version; + private LocalDateTime createdDate; + private LocalDateTime updateDate; +} diff --git a/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java b/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java index a77044fbe..c35be5b4c 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java @@ -12,9 +12,8 @@ @Data @Builder public class CustomerDTO { - - private String name; private UUID id; + private String name; private Integer version; private LocalDateTime createdDate; private LocalDateTime updateDate; From 12b7292103ac239559d68314db7fc755f9e5a877 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 15:46:53 -0400 Subject: [PATCH 042/114] adding UUID generation --- .../springframework/spring6restmvc/entities/Beer.java | 8 +++++--- .../springframework/spring6restmvc/entities/Customer.java | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index bb54f46a4..d361c375a 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -1,10 +1,9 @@ package guru.springframework.spring6restmvc.entities; import guru.springframework.spring6restmvc.model.BeerStyle; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Version; +import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.GenericGenerator; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -22,6 +21,9 @@ public class Beer { @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) private UUID id; @Version diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java index 905980bfe..21b6027cb 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -1,9 +1,8 @@ package guru.springframework.spring6restmvc.entities; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Version; +import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.GenericGenerator; import java.time.LocalDateTime; import java.util.UUID; @@ -20,6 +19,9 @@ public class Customer { @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) private UUID id; private String name; From efdc969112d94416b1775e12de92ef3a2dc44108 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 15:49:14 -0400 Subject: [PATCH 043/114] adding UUID generation --- .../guru/springframework/spring6restmvc/entities/Customer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java index 21b6027cb..c9d6f1c4f 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -17,7 +17,6 @@ @AllArgsConstructor @NoArgsConstructor public class Customer { - @Id @GeneratedValue(generator = "UUID") @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") From b54ead0c6a454e0cb66fbe05016be3a6f8be2190 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 15:55:59 -0400 Subject: [PATCH 044/114] adding JPA Repositories --- .../spring6restmvc/repositories/BeerRepository.java | 12 ++++++++++++ .../repositories/CustomerRepository.java | 12 ++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/repositories/BeerRepository.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/repositories/CustomerRepository.java diff --git a/src/main/java/guru/springframework/spring6restmvc/repositories/BeerRepository.java b/src/main/java/guru/springframework/spring6restmvc/repositories/BeerRepository.java new file mode 100644 index 000000000..314771a4a --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/repositories/BeerRepository.java @@ -0,0 +1,12 @@ +package guru.springframework.spring6restmvc.repositories; + +import guru.springframework.spring6restmvc.entities.Beer; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +public interface BeerRepository extends JpaRepository { +} diff --git a/src/main/java/guru/springframework/spring6restmvc/repositories/CustomerRepository.java b/src/main/java/guru/springframework/spring6restmvc/repositories/CustomerRepository.java new file mode 100644 index 000000000..71c1b2ff3 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/repositories/CustomerRepository.java @@ -0,0 +1,12 @@ +package guru.springframework.spring6restmvc.repositories; + +import guru.springframework.spring6restmvc.entities.Customer; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +public interface CustomerRepository extends JpaRepository { +} From f50c450d09f49695f4acf4845374a341dc8f431f Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 16:05:37 -0400 Subject: [PATCH 045/114] adding JPA tests --- .../repositories/BeerRepositoryTest.java | 25 +++++++++++++++++++ .../repositories/CustomerRepositoryTest.java | 25 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java create mode 100644 src/test/java/guru/springframework/spring6restmvc/repositories/CustomerRepositoryTest.java diff --git a/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java b/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java new file mode 100644 index 000000000..2b9ce8424 --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java @@ -0,0 +1,25 @@ +package guru.springframework.spring6restmvc.repositories; + +import guru.springframework.spring6restmvc.entities.Beer; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +class BeerRepositoryTest { + + @Autowired + BeerRepository beerRepository; + + @Test + void testSaveBeer() { + Beer savedBeer = beerRepository.save(Beer.builder() + .beerName("My Beer") + .build()); + + assertThat(savedBeer).isNotNull(); + assertThat(savedBeer.getId()).isNotNull(); + } +} \ No newline at end of file diff --git a/src/test/java/guru/springframework/spring6restmvc/repositories/CustomerRepositoryTest.java b/src/test/java/guru/springframework/spring6restmvc/repositories/CustomerRepositoryTest.java new file mode 100644 index 000000000..d6848114f --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/repositories/CustomerRepositoryTest.java @@ -0,0 +1,25 @@ +package guru.springframework.spring6restmvc.repositories; + +import guru.springframework.spring6restmvc.entities.Customer; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +class CustomerRepositoryTest { + + @Autowired + CustomerRepository customerRepository; + + @Test + void testSaveCustomer() { + Customer customer = customerRepository.save(Customer.builder() + .name("New Name") + .build()); + + assertThat(customer.getId()).isNotNull(); + + } +} \ No newline at end of file From 8ae747207d057b662250c4725a6a480dcbe1f468 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 14 Aug 2022 11:46:16 -0400 Subject: [PATCH 046/114] adding mapstruct deps and config --- pom.xml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/pom.xml b/pom.xml index 08a988202..80b87b36c 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ spring-6-rest-mvc 17 + 1.5.2.Final @@ -39,6 +40,11 @@ lombok true + + org.mapstruct + mapstruct + ${org.mapstruct.version} + org.springframework.boot spring-boot-starter-test @@ -60,6 +66,35 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + 17 + 17 + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + + -Amapstruct.defaultComponentModel=spring + + + From f7e2fa6f0537b884fd8dc58b96a910d326bdca17 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 14 Aug 2022 11:53:28 -0400 Subject: [PATCH 047/114] Adding Mappers --- .../spring6restmvc/mappers/BeerMapper.java | 17 +++++++++++++++++ .../spring6restmvc/mappers/CustomerMapper.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/mappers/BeerMapper.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/mappers/CustomerMapper.java diff --git a/src/main/java/guru/springframework/spring6restmvc/mappers/BeerMapper.java b/src/main/java/guru/springframework/spring6restmvc/mappers/BeerMapper.java new file mode 100644 index 000000000..015bd59da --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/mappers/BeerMapper.java @@ -0,0 +1,17 @@ +package guru.springframework.spring6restmvc.mappers; + +import guru.springframework.spring6restmvc.entities.Beer; +import guru.springframework.spring6restmvc.model.BeerDTO; +import org.mapstruct.Mapper; + +/** + * Created by jt, Spring Framework Guru. + */ +@Mapper +public interface BeerMapper { + + Beer beerDtoToBeer(BeerDTO dto); + + BeerDTO beerToBeerDto(Beer beer); + +} diff --git a/src/main/java/guru/springframework/spring6restmvc/mappers/CustomerMapper.java b/src/main/java/guru/springframework/spring6restmvc/mappers/CustomerMapper.java new file mode 100644 index 000000000..eef2605c6 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/mappers/CustomerMapper.java @@ -0,0 +1,17 @@ +package guru.springframework.spring6restmvc.mappers; + +import guru.springframework.spring6restmvc.entities.Customer; +import guru.springframework.spring6restmvc.model.CustomerDTO; +import org.mapstruct.Mapper; + +/** + * Created by jt, Spring Framework Guru. + */ +@Mapper +public interface CustomerMapper { + + Customer customerDtoToCustomer(CustomerDTO dto); + + CustomerDTO customerToCustomerDto(Customer customer); + +} From 230d6c75160315c325c0b16d1aef34a55747a270 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 16 Aug 2022 16:10:39 -0400 Subject: [PATCH 048/114] adding jpa bootstrap --- .../bootstrap/BootstrapData.java | 104 ++++++++++++++++++ .../bootstrap/BootstrapDataTest.java | 40 +++++++ 2 files changed, 144 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java create mode 100644 src/test/java/guru/springframework/spring6restmvc/bootstrap/BootstrapDataTest.java diff --git a/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java b/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java new file mode 100644 index 000000000..6209415a0 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java @@ -0,0 +1,104 @@ +package guru.springframework.spring6restmvc.bootstrap; + +import guru.springframework.spring6restmvc.entities.Beer; +import guru.springframework.spring6restmvc.entities.Customer; +import guru.springframework.spring6restmvc.model.BeerStyle; +import guru.springframework.spring6restmvc.repositories.BeerRepository; +import guru.springframework.spring6restmvc.repositories.CustomerRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Component +@RequiredArgsConstructor +public class BootstrapData implements CommandLineRunner { + private final BeerRepository beerRepository; + private final CustomerRepository customerRepository; + + @Override + public void run(String... args) throws Exception { + loadBeerData(); + loadCustomerData(); + } + + private void loadBeerData() { + if (beerRepository.count() == 0){ + Beer beer1 = Beer.builder() + .beerName("Galaxy Cat") + .beerStyle(BeerStyle.PALE_ALE) + .upc("12356") + .price(new BigDecimal("12.99")) + .quantityOnHand(122) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Beer beer2 = Beer.builder() + .beerName("Crank") + .beerStyle(BeerStyle.PALE_ALE) + .upc("12356222") + .price(new BigDecimal("11.99")) + .quantityOnHand(392) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Beer beer3 = Beer.builder() + .beerName("Sunshine City") + .beerStyle(BeerStyle.IPA) + .upc("12356") + .price(new BigDecimal("13.99")) + .quantityOnHand(144) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + beerRepository.save(beer1); + beerRepository.save(beer2); + beerRepository.save(beer3); + } + + } + + private void loadCustomerData() { + + if (customerRepository.count() == 0) { + Customer customer1 = Customer.builder() + .id(UUID.randomUUID()) + .name("Customer 1") + .version(1) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Customer customer2 = Customer.builder() + .id(UUID.randomUUID()) + .name("Customer 2") + .version(1) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + Customer customer3 = Customer.builder() + .id(UUID.randomUUID()) + .name("Customer 3") + .version(1) + .createdDate(LocalDateTime.now()) + .updateDate(LocalDateTime.now()) + .build(); + + customerRepository.saveAll(Arrays.asList(customer1, customer2, customer3)); + } + + } + + +} diff --git a/src/test/java/guru/springframework/spring6restmvc/bootstrap/BootstrapDataTest.java b/src/test/java/guru/springframework/spring6restmvc/bootstrap/BootstrapDataTest.java new file mode 100644 index 000000000..a812d628d --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/bootstrap/BootstrapDataTest.java @@ -0,0 +1,40 @@ +package guru.springframework.spring6restmvc.bootstrap; + +import guru.springframework.spring6restmvc.repositories.BeerRepository; +import guru.springframework.spring6restmvc.repositories.CustomerRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +class BootstrapDataTest { + + @Autowired + BeerRepository beerRepository; + + @Autowired + CustomerRepository customerRepository; + + BootstrapData bootstrapData; + + @BeforeEach + void setUp() { + bootstrapData = new BootstrapData(beerRepository, customerRepository); + } + + @Test + void Testrun() throws Exception { + bootstrapData.run(null); + + assertThat(beerRepository.count()).isEqualTo(3); + assertThat(customerRepository.count()).isEqualTo(3); + } +} + + + + + From 4e59323f22f35cb9f86deefb526af491a64d5c77 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 16 Aug 2022 16:22:13 -0400 Subject: [PATCH 049/114] creating initial JPA services --- .../services/BeerServiceJPA.java | 53 +++++++++++++++++++ .../services/CustomerServiceJPA.java | 53 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java new file mode 100644 index 000000000..f1e093f0e --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -0,0 +1,53 @@ +package guru.springframework.spring6restmvc.services; + +import guru.springframework.spring6restmvc.mappers.BeerMapper; +import guru.springframework.spring6restmvc.model.BeerDTO; +import guru.springframework.spring6restmvc.repositories.BeerRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Service +@Primary +@RequiredArgsConstructor +public class BeerServiceJPA implements BeerService { + private final BeerRepository beerRepository; + private final BeerMapper beerMapper; + + @Override + public List listBeers() { + return null; + } + + @Override + public Optional getBeerById(UUID id) { + return Optional.empty(); + } + + @Override + public BeerDTO saveNewBeer(BeerDTO beer) { + return null; + } + + @Override + public void updateBeerById(UUID beerId, BeerDTO beer) { + + } + + @Override + public void deleteById(UUID beerId) { + + } + + @Override + public void patchBeerById(UUID beerId, BeerDTO beer) { + + } +} diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java new file mode 100644 index 000000000..79809ae73 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java @@ -0,0 +1,53 @@ +package guru.springframework.spring6restmvc.services; + +import guru.springframework.spring6restmvc.mappers.CustomerMapper; +import guru.springframework.spring6restmvc.model.CustomerDTO; +import guru.springframework.spring6restmvc.repositories.CustomerRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Service +@Primary +@RequiredArgsConstructor +public class CustomerServiceJPA implements CustomerService { + private final CustomerRepository customerRepository; + private final CustomerMapper customerMapper; + + @Override + public Optional getCustomerById(UUID uuid) { + return Optional.empty(); + } + + @Override + public List getAllCustomers() { + return null; + } + + @Override + public CustomerDTO saveNewCustomer(CustomerDTO customer) { + return null; + } + + @Override + public void updateCustomerById(UUID customerId, CustomerDTO customer) { + + } + + @Override + public void deleteCustomerById(UUID customerId) { + + } + + @Override + public void patchCustomerById(UUID customerId, CustomerDTO customer) { + + } +} From 5f967b687cf55aa2fdf87261978f177bb5a111ad Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 09:32:34 -0400 Subject: [PATCH 050/114] JPA Get Operations --- .../spring6restmvc/services/BeerServiceJPA.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java index f1e093f0e..2558cb743 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; /** * Created by jt, Spring Framework Guru. @@ -23,12 +24,16 @@ public class BeerServiceJPA implements BeerService { @Override public List listBeers() { - return null; + return beerRepository.findAll() + .stream() + .map(beerMapper::beerToBeerDto) + .collect(Collectors.toList()); } @Override public Optional getBeerById(UUID id) { - return Optional.empty(); + return Optional.ofNullable(beerMapper.beerToBeerDto(beerRepository.findById(id) + .orElse(null))); } @Override From 1b82a084916b4e945f8579f7890f805a9e5eacec Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 12:21:15 -0400 Subject: [PATCH 051/114] testing controller list operation --- .../controller/BeerControllerIT.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java new file mode 100644 index 000000000..8d3a3f784 --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -0,0 +1,46 @@ +package guru.springframework.spring6restmvc.controller; + +import guru.springframework.spring6restmvc.model.BeerDTO; +import guru.springframework.spring6restmvc.repositories.BeerRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class BeerControllerIT { + @Autowired + BeerController beerController; + + @Autowired + BeerRepository beerRepository; + + @Test + void testListBeers() { + List dtos = beerController.listBeers(); + + assertThat(dtos.size()).isEqualTo(3); + } + + @Rollback + @Transactional + @Test + void testEmptyList() { + beerRepository.deleteAll(); + List dtos = beerController.listBeers(); + + assertThat(dtos.size()).isEqualTo(0); + } +} + + + + + + + From 8fd4db08235470ca996c7b2fe2cd6b61b0499668 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 12:49:38 -0400 Subject: [PATCH 052/114] adding expected exception --- .../controller/BeerControllerIT.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index 8d3a3f784..3e58c228f 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -1,5 +1,6 @@ package guru.springframework.spring6restmvc.controller; +import guru.springframework.spring6restmvc.entities.Beer; import guru.springframework.spring6restmvc.model.BeerDTO; import guru.springframework.spring6restmvc.repositories.BeerRepository; import org.junit.jupiter.api.Test; @@ -9,8 +10,10 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; @SpringBootTest class BeerControllerIT { @@ -20,6 +23,22 @@ class BeerControllerIT { @Autowired BeerRepository beerRepository; + @Test + void testBeerIdNotFound() { + assertThrows(NotFoundException.class, () -> { + beerController.getBeerById(UUID.randomUUID()); + }); + } + + @Test + void testGetById() { + Beer beer = beerRepository.findAll().get(0); + + BeerDTO dto = beerController.getBeerById(beer.getId()); + + assertThat(dto).isNotNull(); + } + @Test void testListBeers() { List dtos = beerController.listBeers(); From 1f9aa1833ff0eebe6abb1ecaf2ba3e1992818298 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 14:07:12 -0400 Subject: [PATCH 053/114] adding customer get operations --- .../services/CustomerServiceJPA.java | 8 ++- .../controller/CustomerControllerIT.java | 67 +++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerIT.java diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java index 79809ae73..8bac0c179 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; /** * Created by jt, Spring Framework Guru. @@ -23,12 +24,15 @@ public class CustomerServiceJPA implements CustomerService { @Override public Optional getCustomerById(UUID uuid) { - return Optional.empty(); + return Optional.ofNullable(customerMapper + .customerToCustomerDto(customerRepository.findById(uuid).orElse(null))); } @Override public List getAllCustomers() { - return null; + return customerRepository.findAll().stream() + .map(customerMapper::customerToCustomerDto) + .collect(Collectors.toList()); } @Override diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerIT.java new file mode 100644 index 000000000..2b8e694cd --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerIT.java @@ -0,0 +1,67 @@ +package guru.springframework.spring6restmvc.controller; + +import guru.springframework.spring6restmvc.entities.Customer; +import guru.springframework.spring6restmvc.model.CustomerDTO; +import guru.springframework.spring6restmvc.repositories.CustomerRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@SpringBootTest +class CustomerControllerIT { + + @Autowired + CustomerRepository customerRepository; + + @Autowired + CustomerController customerController; + + @Rollback + @Transactional + @Test + void testListAllEmptyList() { + customerRepository.deleteAll(); + List dtos = customerController.listAllCustomers(); + + assertThat(dtos.size()).isEqualTo(0); + } + + @Test + void testListAll() { + List dtos = customerController.listAllCustomers(); + + assertThat(dtos.size()).isEqualTo(3); + } + + @Test + void testGetByIdNotFound() { + assertThrows(NotFoundException.class, () -> { + customerController.getCustomerById(UUID.randomUUID()); + }); + } + + @Test + void testGetById() { + Customer customer = customerRepository.findAll().get(0); + CustomerDTO customerDTO = customerController.getCustomerById(customer.getId()); + assertThat(customerDTO).isNotNull(); + } +} + + + + + + + + + + From 2405dfb879c1c2322b55df0baeb31ef3eceaec47 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 14:46:04 -0400 Subject: [PATCH 054/114] impl save new beer JPA --- .../services/BeerServiceJPA.java | 2 +- .../controller/BeerControllerIT.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java index 2558cb743..06ab6be58 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -38,7 +38,7 @@ public Optional getBeerById(UUID id) { @Override public BeerDTO saveNewBeer(BeerDTO beer) { - return null; + return beerMapper.beerToBeerDto(beerRepository.save(beerMapper.beerDtoToBeer(beer))); } @Override diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index 3e58c228f..d80d50d79 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -6,6 +6,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; @@ -23,6 +25,26 @@ class BeerControllerIT { @Autowired BeerRepository beerRepository; + @Rollback + @Transactional + @Test + void saveNewBeerTest() { + BeerDTO beerDTO = BeerDTO.builder() + .beerName("New Beer") + .build(); + + ResponseEntity responseEntity = beerController.handlePost(beerDTO); + + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatusCode.valueOf(201)); + assertThat(responseEntity.getHeaders().getLocation()).isNotNull(); + + String[] locationUUID = responseEntity.getHeaders().getLocation().getPath().split("/"); + UUID savedUUID = UUID.fromString(locationUUID[4]); + + Beer beer = beerRepository.findById(savedUUID).get(); + assertThat(beer).isNotNull(); + } + @Test void testBeerIdNotFound() { assertThrows(NotFoundException.class, () -> { From 6dae7defac880b554133f757c936cca07078f6d8 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 15:55:54 -0400 Subject: [PATCH 055/114] impl update of beer --- .../services/BeerServiceJPA.java | 8 +++++++- .../controller/BeerControllerIT.java | 20 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java index 06ab6be58..e1323d2f4 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -43,7 +43,13 @@ public BeerDTO saveNewBeer(BeerDTO beer) { @Override public void updateBeerById(UUID beerId, BeerDTO beer) { - + beerRepository.findById(beerId).ifPresent(foundBeer -> { + foundBeer.setBeerName(beer.getBeerName()); + foundBeer.setBeerStyle(beer.getBeerStyle()); + foundBeer.setUpc(beer.getUpc()); + foundBeer.setPrice(beer.getPrice()); + beerRepository.save(foundBeer); + }); } @Override diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index d80d50d79..5eb3eefc9 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -1,6 +1,7 @@ package guru.springframework.spring6restmvc.controller; import guru.springframework.spring6restmvc.entities.Beer; +import guru.springframework.spring6restmvc.mappers.BeerMapper; import guru.springframework.spring6restmvc.model.BeerDTO; import guru.springframework.spring6restmvc.repositories.BeerRepository; import org.junit.jupiter.api.Test; @@ -25,6 +26,25 @@ class BeerControllerIT { @Autowired BeerRepository beerRepository; + @Autowired + BeerMapper beerMapper; + + @Test + void updateExistingBeer() { + Beer beer = beerRepository.findAll().get(0); + BeerDTO beerDTO = beerMapper.beerToBeerDto(beer); + beerDTO.setId(null); + beerDTO.setVersion(null); + final String beerName = "UPDATED"; + beerDTO.setBeerName(beerName); + + ResponseEntity responseEntity = beerController.updateById(beer.getId(), beerDTO); + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatusCode.valueOf(204)); + + Beer updatedBeer = beerRepository.findById(beer.getId()).get(); + assertThat(updatedBeer.getBeerName()).isEqualTo(beerName); + } + @Rollback @Transactional @Test From dbc3536a4287866b87f16eb173d0e910ade5911f Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 16:08:24 -0400 Subject: [PATCH 056/114] handle update not found --- .../spring6restmvc/controller/BeerController.java | 4 +++- .../spring6restmvc/services/BeerService.java | 2 +- .../spring6restmvc/services/BeerServiceImpl.java | 3 ++- .../spring6restmvc/services/BeerServiceJPA.java | 14 +++++++++++--- .../controller/BeerControllerIT.java | 7 +++++++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index cd2ce77f4..3ee3e3e1f 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -44,7 +44,9 @@ public ResponseEntity deleteById(@PathVariable("beerId") UUID beerId){ @PutMapping(BEER_PATH_ID) public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBody BeerDTO beer){ - beerService.updateBeerById(beerId, beer); + if( beerService.updateBeerById(beerId, beer).isEmpty()){ + throw new NotFoundException(); + } return new ResponseEntity(HttpStatus.NO_CONTENT); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index 1db44edd7..5d7517639 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -17,7 +17,7 @@ public interface BeerService { BeerDTO saveNewBeer(BeerDTO beer); - void updateBeerById(UUID beerId, BeerDTO beer); + Optional updateBeerById(UUID beerId, BeerDTO beer); void deleteById(UUID beerId); diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index 3ace7743a..bd92bb856 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -94,12 +94,13 @@ public void deleteById(UUID beerId) { } @Override - public void updateBeerById(UUID beerId, BeerDTO beer) { + public Optional updateBeerById(UUID beerId, BeerDTO beer) { BeerDTO existing = beerMap.get(beerId); existing.setBeerName(beer.getBeerName()); existing.setPrice(beer.getPrice()); existing.setUpc(beer.getUpc()); existing.setQuantityOnHand(beer.getQuantityOnHand()); + return Optional.of(existing); } @Override diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java index e1323d2f4..a9b538984 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** @@ -42,14 +43,21 @@ public BeerDTO saveNewBeer(BeerDTO beer) { } @Override - public void updateBeerById(UUID beerId, BeerDTO beer) { - beerRepository.findById(beerId).ifPresent(foundBeer -> { + public Optional updateBeerById(UUID beerId, BeerDTO beer) { + AtomicReference> atomicReference = new AtomicReference<>(); + + beerRepository.findById(beerId).ifPresentOrElse(foundBeer -> { foundBeer.setBeerName(beer.getBeerName()); foundBeer.setBeerStyle(beer.getBeerStyle()); foundBeer.setUpc(beer.getUpc()); foundBeer.setPrice(beer.getPrice()); - beerRepository.save(foundBeer); + atomicReference.set(Optional.of(beerMapper + .beerToBeerDto(beerRepository.save(foundBeer)))); + }, () -> { + atomicReference.set(Optional.empty()); }); + + return atomicReference.get(); } @Override diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index 5eb3eefc9..4a729de16 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -29,6 +29,13 @@ class BeerControllerIT { @Autowired BeerMapper beerMapper; + @Test + void testUpdateNotFound() { + assertThrows(NotFoundException.class, () -> { + beerController.updateById(UUID.randomUUID(), BeerDTO.builder().build()); + }); + } + @Test void updateExistingBeer() { Beer beer = beerRepository.findAll().get(0); From 08adbf09aee5f48b4d9486871d33e61664154a9e Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 16:20:14 -0400 Subject: [PATCH 057/114] jpa delete beer by id --- .../spring6restmvc/services/BeerServiceJPA.java | 1 + .../controller/BeerControllerIT.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java index a9b538984..ff12ef383 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -63,6 +63,7 @@ public Optional updateBeerById(UUID beerId, BeerDTO beer) { @Override public void deleteById(UUID beerId) { + beerRepository.deleteById(beerId); } @Override diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index 4a729de16..63369b951 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -29,6 +29,19 @@ class BeerControllerIT { @Autowired BeerMapper beerMapper; + + @Rollback + @Transactional + @Test + void deleteByIdFound() { + Beer beer = beerRepository.findAll().get(0); + + ResponseEntity responseEntity = beerController.deleteById(beer.getId()); + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatusCode.valueOf(204)); + + assertThat(beerRepository.findById(beer.getId()).isEmpty()); + } + @Test void testUpdateNotFound() { assertThrows(NotFoundException.class, () -> { @@ -36,6 +49,8 @@ void testUpdateNotFound() { }); } + @Rollback + @Transactional @Test void updateExistingBeer() { Beer beer = beerRepository.findAll().get(0); From 1ebc188f3321e95aedd16920226f543ae6be0924 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 16:31:54 -0400 Subject: [PATCH 058/114] fixing failing update test --- .../spring6restmvc/controller/BeerControllerTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 3224fc46e..5f4116466 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -88,6 +88,8 @@ void testDeleteBeer() throws Exception { void testUpdateBeer() throws Exception { BeerDTO beer = beerServiceImpl.listBeers().get(0); + given(beerService.updateBeerById(any(), any())).willReturn(Optional.of(beer)); + mockMvc.perform(put(BeerController.BEER_PATH_ID, beer.getId()) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) From 6202901a628f4511f1cc1b9b756aae05ca55071c Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 17 Aug 2022 16:34:19 -0400 Subject: [PATCH 059/114] fixing failing update test --- .../spring6restmvc/controller/BeerControllerTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 3224fc46e..5f4116466 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -88,6 +88,8 @@ void testDeleteBeer() throws Exception { void testUpdateBeer() throws Exception { BeerDTO beer = beerServiceImpl.listBeers().get(0); + given(beerService.updateBeerById(any(), any())).willReturn(Optional.of(beer)); + mockMvc.perform(put(BeerController.BEER_PATH_ID, beer.getId()) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) From 4dd93cbf8796ee7a4d28f7081bc5e630437a3fb7 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 18 Aug 2022 09:33:51 -0400 Subject: [PATCH 060/114] adding delete by id not found logic --- .../spring6restmvc/controller/BeerController.java | 4 +++- .../spring6restmvc/services/BeerService.java | 2 +- .../spring6restmvc/services/BeerServiceImpl.java | 4 +++- .../spring6restmvc/services/BeerServiceJPA.java | 9 ++++++--- .../spring6restmvc/controller/BeerControllerIT.java | 7 +++++++ 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 3ee3e3e1f..a361dbcd2 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -36,7 +36,9 @@ public ResponseEntity updateBeerPatchById(@PathVariable("beerId")UUID beerId, @R @DeleteMapping(BEER_PATH_ID) public ResponseEntity deleteById(@PathVariable("beerId") UUID beerId){ - beerService.deleteById(beerId); + if(! beerService.deleteById(beerId)){ + throw new NotFoundException(); + } return new ResponseEntity(HttpStatus.NO_CONTENT); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index 5d7517639..d2eab2d46 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -19,7 +19,7 @@ public interface BeerService { Optional updateBeerById(UUID beerId, BeerDTO beer); - void deleteById(UUID beerId); + Boolean deleteById(UUID beerId); void patchBeerById(UUID beerId, BeerDTO beer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index bd92bb856..4181ba556 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -89,8 +89,10 @@ public void patchBeerById(UUID beerId, BeerDTO beer) { } @Override - public void deleteById(UUID beerId) { + public Boolean deleteById(UUID beerId) { beerMap.remove(beerId); + + return true; } @Override diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java index ff12ef383..d19bcb086 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -61,9 +61,12 @@ public Optional updateBeerById(UUID beerId, BeerDTO beer) { } @Override - public void deleteById(UUID beerId) { - - beerRepository.deleteById(beerId); + public Boolean deleteById(UUID beerId) { + if (beerRepository.existsById(beerId)) { + beerRepository.deleteById(beerId); + return true; + } + return false; } @Override diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index 63369b951..734c4ba78 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -30,6 +30,13 @@ class BeerControllerIT { BeerMapper beerMapper; + @Test + void testDeleteByIDNotFound() { + assertThrows(NotFoundException.class, () -> { + beerController.deleteById(UUID.randomUUID()); + }); + } + @Rollback @Transactional @Test From c6b24242e9399400f89e7d4bb4efefa508b0e5f9 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 18 Aug 2022 16:23:56 -0400 Subject: [PATCH 061/114] fixing mockmvc test --- .../spring6restmvc/controller/BeerControllerTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 5f4116466..6cbafe074 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -75,6 +75,8 @@ void testPatchBeer() throws Exception { void testDeleteBeer() throws Exception { BeerDTO beer = beerServiceImpl.listBeers().get(0); + given(beerService.deleteById(any())).willReturn(true); + mockMvc.perform(delete(BeerController.BEER_PATH_ID, beer.getId()) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); From e652eee6c74d9f464ebaa9d6757de3fae7fc2a6f Mon Sep 17 00:00:00 2001 From: John Thompson Date: Fri, 19 Aug 2022 09:09:40 -0400 Subject: [PATCH 062/114] completing assignment for customer --- .../controller/CustomerController.java | 8 ++- .../spring6restmvc/services/BeerService.java | 2 +- .../services/BeerServiceImpl.java | 4 +- .../services/BeerServiceJPA.java | 28 +++++++- .../services/CustomerService.java | 6 +- .../services/CustomerServiceImpl.java | 11 ++- .../services/CustomerServiceJPA.java | 39 +++++++++-- .../controller/CustomerControllerIT.java | 70 +++++++++++++++++++ .../controller/CustomerControllerTest.java | 5 ++ 9 files changed, 157 insertions(+), 16 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java index 6508178ac..56994057f 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomerController.java @@ -35,7 +35,9 @@ public ResponseEntity patchCustomerById(@PathVariable("customerId") UUID custome @DeleteMapping(CUSTOMER_PATH_ID) public ResponseEntity deleteCustomerById(@PathVariable("customerId") UUID customerId){ - customerService.deleteCustomerById(customerId); + if (!customerService.deleteCustomerById(customerId)){ + throw new NotFoundException(); + } return new ResponseEntity(HttpStatus.NO_CONTENT); } @@ -44,7 +46,9 @@ public ResponseEntity deleteCustomerById(@PathVariable("customerId") UUID custom public ResponseEntity updateCustomerByID(@PathVariable("customerId") UUID customerId, @RequestBody CustomerDTO customer){ - customerService.updateCustomerById(customerId, customer); + if (customerService.updateCustomerById(customerId, customer).isEmpty()){ + throw new NotFoundException(); + } return new ResponseEntity(HttpStatus.NO_CONTENT); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index d2eab2d46..3f795410e 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -21,5 +21,5 @@ public interface BeerService { Boolean deleteById(UUID beerId); - void patchBeerById(UUID beerId, BeerDTO beer); + Optional patchBeerById(UUID beerId, BeerDTO beer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index 4181ba556..7e0e1c047 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -64,7 +64,7 @@ public BeerServiceImpl() { } @Override - public void patchBeerById(UUID beerId, BeerDTO beer) { + public Optional patchBeerById(UUID beerId, BeerDTO beer) { BeerDTO existing = beerMap.get(beerId); if (StringUtils.hasText(beer.getBeerName())){ @@ -86,6 +86,8 @@ public void patchBeerById(UUID beerId, BeerDTO beer) { if (StringUtils.hasText(beer.getUpc())) { existing.setUpc(beer.getUpc()); } + + return Optional.of(existing); } @Override diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java index d19bcb086..8e675a298 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.util.List; import java.util.Optional; @@ -51,6 +52,7 @@ public Optional updateBeerById(UUID beerId, BeerDTO beer) { foundBeer.setBeerStyle(beer.getBeerStyle()); foundBeer.setUpc(beer.getUpc()); foundBeer.setPrice(beer.getPrice()); + foundBeer.setQuantityOnHand(beer.getQuantityOnHand()); atomicReference.set(Optional.of(beerMapper .beerToBeerDto(beerRepository.save(foundBeer)))); }, () -> { @@ -70,7 +72,31 @@ public Boolean deleteById(UUID beerId) { } @Override - public void patchBeerById(UUID beerId, BeerDTO beer) { + public Optional patchBeerById(UUID beerId, BeerDTO beer) { + AtomicReference> atomicReference = new AtomicReference<>(); + beerRepository.findById(beerId).ifPresentOrElse(foundBeer -> { + if (StringUtils.hasText(beer.getBeerName())){ + foundBeer.setBeerName(beer.getBeerName()); + } + if (beer.getBeerStyle() != null){ + foundBeer.setBeerStyle(beer.getBeerStyle()); + } + if (StringUtils.hasText(beer.getUpc())){ + foundBeer.setUpc(beer.getUpc()); + } + if (beer.getPrice() != null){ + foundBeer.setPrice(beer.getPrice()); + } + if (beer.getQuantityOnHand() != null){ + foundBeer.setQuantityOnHand(beer.getQuantityOnHand()); + } + atomicReference.set(Optional.of(beerMapper + .beerToBeerDto(beerRepository.save(foundBeer)))); + }, () -> { + atomicReference.set(Optional.empty()); + }); + + return atomicReference.get(); } } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java index c4c2291cb..cdadac861 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerService.java @@ -17,9 +17,9 @@ public interface CustomerService { CustomerDTO saveNewCustomer(CustomerDTO customer); - void updateCustomerById(UUID customerId, CustomerDTO customer); + Optional updateCustomerById(UUID customerId, CustomerDTO customer); - void deleteCustomerById(UUID customerId); + Boolean deleteCustomerById(UUID customerId); - void patchCustomerById(UUID customerId, CustomerDTO customer); + Optional patchCustomerById(UUID customerId, CustomerDTO customer); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java index 671159fe3..27a2c5b2b 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceImpl.java @@ -47,23 +47,28 @@ public CustomerServiceImpl() { } @Override - public void patchCustomerById(UUID customerId, CustomerDTO customer) { + public Optional patchCustomerById(UUID customerId, CustomerDTO customer) { CustomerDTO existing = customerMap.get(customerId); if (StringUtils.hasText(customer.getName())) { existing.setName(customer.getName()); } + + return Optional.of(existing); } @Override - public void deleteCustomerById(UUID customerId) { + public Boolean deleteCustomerById(UUID customerId) { customerMap.remove(customerId); + + return true; } @Override - public void updateCustomerById(UUID customerId, CustomerDTO customer) { + public Optional updateCustomerById(UUID customerId, CustomerDTO customer) { CustomerDTO existing = customerMap.get(customerId); existing.setName(customer.getName()); + return Optional.of(existing); } @Override diff --git a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java index 8bac0c179..030f5e850 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/CustomerServiceJPA.java @@ -6,10 +6,12 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** @@ -37,21 +39,48 @@ public List getAllCustomers() { @Override public CustomerDTO saveNewCustomer(CustomerDTO customer) { - return null; + return customerMapper.customerToCustomerDto(customerRepository + .save(customerMapper.customerDtoToCustomer(customer))); } @Override - public void updateCustomerById(UUID customerId, CustomerDTO customer) { + public Optional updateCustomerById(UUID customerId, CustomerDTO customer) { + AtomicReference> atomicReference = new AtomicReference<>(); + customerRepository.findById(customerId).ifPresentOrElse(foundCustomer -> { + foundCustomer.setName(customer.getName()); + atomicReference.set(Optional.of(customerMapper + .customerToCustomerDto(customerRepository.save(foundCustomer)))); + }, () -> { + atomicReference.set(Optional.empty()); + }); + + return atomicReference.get(); } @Override - public void deleteCustomerById(UUID customerId) { - + public Boolean deleteCustomerById(UUID customerId) { + if(customerRepository.existsById(customerId)){ + customerRepository.deleteById(customerId); + return true; + } + return false; } @Override - public void patchCustomerById(UUID customerId, CustomerDTO customer) { + public Optional patchCustomerById(UUID customerId, CustomerDTO customer) { + AtomicReference> atomicReference = new AtomicReference<>(); + + customerRepository.findById(customerId).ifPresentOrElse(foundCustomer -> { + if (StringUtils.hasText(customer.getName())){ + foundCustomer.setName(customer.getName()); + } + atomicReference.set(Optional.of(customerMapper + .customerToCustomerDto(customerRepository.save(foundCustomer)))); + }, () -> { + atomicReference.set(Optional.empty()); + }); + return atomicReference.get(); } } diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerIT.java index 2b8e694cd..46dca1904 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerIT.java @@ -1,11 +1,14 @@ package guru.springframework.spring6restmvc.controller; import guru.springframework.spring6restmvc.entities.Customer; +import guru.springframework.spring6restmvc.mappers.CustomerMapper; import guru.springframework.spring6restmvc.model.CustomerDTO; import guru.springframework.spring6restmvc.repositories.CustomerRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; @@ -24,6 +27,73 @@ class CustomerControllerIT { @Autowired CustomerController customerController; + @Autowired + CustomerMapper customerMapper; + + @Rollback + @Transactional + @Test + void deleteByIdFound() { + Customer customer = customerRepository.findAll().get(0); + + ResponseEntity responseEntity = customerController.deleteCustomerById(customer.getId()); + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatusCode.valueOf(204)); + + assertThat(customerRepository.findById(customer.getId()).isEmpty()); + } + + @Test + void testDeleteNotFound() { + assertThrows(NotFoundException.class, () -> { + customerController.deleteCustomerById(UUID.randomUUID()); + }); + } + + @Test + void testUpdateNotFound() { + assertThrows(NotFoundException.class, () -> { + customerController.updateCustomerByID(UUID.randomUUID(), CustomerDTO.builder().build()); + }); + } + + @Rollback + @Transactional + @Test + void updateExistingBeer() { + Customer customer = customerRepository.findAll().get(0); + CustomerDTO customerDTO = customerMapper.customerToCustomerDto(customer); + customerDTO.setId(null); + customerDTO.setVersion(null); + final String customerName = "UPDATED"; + customerDTO.setName(customerName); + + ResponseEntity responseEntity = customerController.updateCustomerByID(customer.getId(), customerDTO); + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatusCode.valueOf(204)); + + Customer updatedCustomer = customerRepository.findById(customer.getId()).get(); + assertThat(updatedCustomer.getName()).isEqualTo(customerName); + } + + @Rollback + @Transactional + @Test + void saveNewBeerTest() { + CustomerDTO customerDTO = CustomerDTO.builder() + .name("TEST") + .build(); + + ResponseEntity responseEntity = customerController.handlePost(customerDTO); + + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatusCode.valueOf(201)); + assertThat(responseEntity.getHeaders().getLocation()).isNotNull(); + + String[] locationUUID = responseEntity.getHeaders().getLocation().getPath().split("/"); + UUID savedUUID = UUID.fromString(locationUUID[4]); + + Customer customer = customerRepository.findById(savedUUID).get(); + assertThat(customer).isNotNull(); + } + @Rollback @Transactional @Test diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 2e0c456bd..73e3e7f2c 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -76,6 +76,8 @@ void testPatchCustomer() throws Exception { void testDeleteCustomer() throws Exception { CustomerDTO customer = customerServiceImpl.getAllCustomers().get(0); + given(customerService.deleteCustomerById(any())).willReturn(true); + mockMvc.perform(delete(CustomerController.CUSTOMER_PATH_ID, customer.getId()) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); @@ -89,6 +91,9 @@ void testDeleteCustomer() throws Exception { void testUpdateCustomer() throws Exception { CustomerDTO customer = customerServiceImpl.getAllCustomers().get(0); + given(customerService.updateCustomerById(any(), any())).willReturn(Optional.of(CustomerDTO.builder() + .build())); + mockMvc.perform(put(CustomerController.CUSTOMER_PATH_ID, customer.getId()) .content(objectMapper.writeValueAsString(customer)) .contentType(MediaType.APPLICATION_JSON) From b0a7b5ac22b3b2bc75f94a421e6c64feb67ebbed Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 08:43:01 -0400 Subject: [PATCH 063/114] adding validation dependencies --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 80b87b36c..fb1a9341e 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-validation + org.springframework.boot spring-boot-devtools From 63b9c1fb3738bc048069a7a1dec96d79f2f2c665 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 09:58:33 -0400 Subject: [PATCH 064/114] adding controller binding validation --- .../spring6restmvc/controller/BeerController.java | 3 ++- .../spring6restmvc/model/BeerDTO.java | 5 +++++ .../controller/BeerControllerTest.java | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index a361dbcd2..519bfdcd7 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -7,6 +7,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -54,7 +55,7 @@ public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBod } @PostMapping(BEER_PATH) - public ResponseEntity handlePost(@RequestBody BeerDTO beer){ + public ResponseEntity handlePost(@Validated @RequestBody BeerDTO beer){ BeerDTO savedBeer = beerService.saveNewBeer(beer); diff --git a/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java index eee5ad954..03f67f6d2 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java @@ -1,5 +1,7 @@ package guru.springframework.spring6restmvc.model; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Builder; import lombok.Data; @@ -15,6 +17,9 @@ public class BeerDTO { private UUID id; private Integer version; + + @NotBlank + @NotNull private String beerName; private BeerStyle beerStyle; private String upc; diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 6cbafe074..6db21dcd6 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -117,6 +117,20 @@ void testCreateNewBeer() throws Exception { .andExpect(header().exists("Location")); } + @Test + void testCreateBeerNullBeerName() throws Exception { + + BeerDTO beerDTO = BeerDTO.builder().build(); + + given(beerService.saveNewBeer(any(BeerDTO.class))).willReturn(beerServiceImpl.listBeers().get(1)); + + mockMvc.perform(post(BeerController.BEER_PATH) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(beerDTO))) + .andExpect(status().isBadRequest()); + } + @Test void testListBeers() throws Exception { given(beerService.listBeers()).willReturn(beerServiceImpl.listBeers()); From e3b46daf8adae8f2e396a2578d9f8ae1c9c1ef43 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 10:11:52 -0400 Subject: [PATCH 065/114] adding custom error handler --- .../controller/CustomErrorController.java | 18 ++++++++++++++++++ .../controller/BeerControllerTest.java | 7 +++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java new file mode 100644 index 000000000..22e08a5f7 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java @@ -0,0 +1,18 @@ +package guru.springframework.spring6restmvc.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +/** + * Created by jt, Spring Framework Guru. + */ +@ControllerAdvice +public class CustomErrorController { + + @ExceptionHandler(MethodArgumentNotValidException.class) + ResponseEntity handleBindErrors(MethodArgumentNotValidException exception){ + return ResponseEntity.badRequest().body(exception.getBindingResult().getFieldErrors()); + } +} diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 6db21dcd6..bf700a572 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -13,6 +13,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import java.util.HashMap; import java.util.Map; @@ -124,11 +125,13 @@ void testCreateBeerNullBeerName() throws Exception { given(beerService.saveNewBeer(any(BeerDTO.class))).willReturn(beerServiceImpl.listBeers().get(1)); - mockMvc.perform(post(BeerController.BEER_PATH) + MvcResult mvcResult = mockMvc.perform(post(BeerController.BEER_PATH) .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beerDTO))) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()).andReturn(); + + System.out.println(mvcResult.getResponse().getContentAsString()); } @Test From d760a3c1542a92135e352a60e2f690d44a8d9926 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 10:22:04 -0400 Subject: [PATCH 066/114] adding custom error body --- .../controller/CustomErrorController.java | 15 ++++++++++++++- .../controller/BeerControllerTest.java | 4 +++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java index 22e08a5f7..51578fd9b 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java @@ -5,6 +5,11 @@ import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * Created by jt, Spring Framework Guru. */ @@ -13,6 +18,14 @@ public class CustomErrorController { @ExceptionHandler(MethodArgumentNotValidException.class) ResponseEntity handleBindErrors(MethodArgumentNotValidException exception){ - return ResponseEntity.badRequest().body(exception.getBindingResult().getFieldErrors()); + + List errorList = exception.getFieldErrors().stream() + .map(fieldError -> { + Map errorMap = new HashMap<>(); + errorMap.put(fieldError.getField(), fieldError.getDefaultMessage()); + return errorMap; + }).collect(Collectors.toList()); + + return ResponseEntity.badRequest().body(errorList); } } diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index bf700a572..9ff8c28c4 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -129,7 +129,9 @@ void testCreateBeerNullBeerName() throws Exception { .accept(MediaType.APPLICATION_JSON) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beerDTO))) - .andExpect(status().isBadRequest()).andReturn(); + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.length()", is(2))) + .andReturn(); System.out.println(mvcResult.getResponse().getContentAsString()); } From 969a6e80bdff69d0c3f0364b610a384f92899b1d Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 10:48:11 -0400 Subject: [PATCH 067/114] completing beer dto validation --- .../controller/BeerController.java | 2 +- .../spring6restmvc/model/BeerDTO.java | 7 +++++++ .../controller/BeerControllerTest.java | 17 ++++++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 519bfdcd7..33d7faf2f 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -45,7 +45,7 @@ public ResponseEntity deleteById(@PathVariable("beerId") UUID beerId){ } @PutMapping(BEER_PATH_ID) - public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @RequestBody BeerDTO beer){ + public ResponseEntity updateById(@PathVariable("beerId")UUID beerId, @Validated @RequestBody BeerDTO beer){ if( beerService.updateBeerById(beerId, beer).isEmpty()){ throw new NotFoundException(); diff --git a/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java index 03f67f6d2..af858bfed 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java @@ -21,9 +21,16 @@ public class BeerDTO { @NotBlank @NotNull private String beerName; + + @NotNull private BeerStyle beerStyle; + + @NotNull + @NotBlank private String upc; private Integer quantityOnHand; + + @NotNull private BigDecimal price; private LocalDateTime createdDate; private LocalDateTime updateDate; diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 9ff8c28c4..bff9d6924 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -102,6 +102,21 @@ void testUpdateBeer() throws Exception { verify(beerService).updateBeerById(any(UUID.class), any(BeerDTO.class)); } + @Test + void testUpdateBeerBlankName() throws Exception { + BeerDTO beer = beerServiceImpl.listBeers().get(0); + beer.setBeerName(""); + given(beerService.updateBeerById(any(), any())).willReturn(Optional.of(beer)); + + mockMvc.perform(put(BeerController.BEER_PATH_ID, beer.getId()) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(beer))) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.length()", is(1))); + + } + @Test void testCreateNewBeer() throws Exception { BeerDTO beer = beerServiceImpl.listBeers().get(0); @@ -130,7 +145,7 @@ void testCreateBeerNullBeerName() throws Exception { .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beerDTO))) .andExpect(status().isBadRequest()) - .andExpect(jsonPath("$.length()", is(2))) + .andExpect(jsonPath("$.length()", is(6))) .andReturn(); System.out.println(mvcResult.getResponse().getContentAsString()); From 3d4eadc1c6bf904845b4c2209ceb11263b1dfabf Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 12:48:26 -0400 Subject: [PATCH 068/114] adding JPA validation --- .../spring6restmvc/entities/Beer.java | 12 ++++++++++++ .../repositories/BeerRepositoryTest.java | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index d361c375a..920301f1b 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -2,6 +2,8 @@ import guru.springframework.spring6restmvc.model.BeerStyle; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.*; import org.hibernate.annotations.GenericGenerator; @@ -28,10 +30,20 @@ public class Beer { @Version private Integer version; + + @NotNull + @NotBlank private String beerName; + + @NotNull private BeerStyle beerStyle; + + @NotNull + @NotBlank private String upc; private Integer quantityOnHand; + + @NotNull private BigDecimal price; private LocalDateTime createdDate; private LocalDateTime updateDate; diff --git a/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java b/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java index 2b9ce8424..d839ecf6f 100644 --- a/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java @@ -1,10 +1,13 @@ package guru.springframework.spring6restmvc.repositories; import guru.springframework.spring6restmvc.entities.Beer; +import guru.springframework.spring6restmvc.model.BeerStyle; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import java.math.BigDecimal; + import static org.assertj.core.api.Assertions.assertThat; @DataJpaTest @@ -17,8 +20,13 @@ class BeerRepositoryTest { void testSaveBeer() { Beer savedBeer = beerRepository.save(Beer.builder() .beerName("My Beer") + .beerStyle(BeerStyle.PALE_ALE) + .upc("234234234234") + .price(new BigDecimal("11.99")) .build()); + beerRepository.flush(); + assertThat(savedBeer).isNotNull(); assertThat(savedBeer.getId()).isNotNull(); } From 4d47cb2e45a7dffaf6293580cc0cb248871fd4af Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 12:59:12 -0400 Subject: [PATCH 069/114] adding database constraint validation --- .../spring6restmvc/entities/Beer.java | 4 ++++ .../repositories/BeerRepositoryTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index 920301f1b..a007e2d54 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -4,6 +4,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.*; import org.hibernate.annotations.GenericGenerator; @@ -33,6 +34,8 @@ public class Beer { @NotNull @NotBlank + @Size(max = 50) + @Column(length = 50) private String beerName; @NotNull @@ -40,6 +43,7 @@ public class Beer { @NotNull @NotBlank + @Size(max = 255) private String upc; private Integer quantityOnHand; diff --git a/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java b/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java index d839ecf6f..1e8039427 100644 --- a/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java @@ -2,6 +2,7 @@ import guru.springframework.spring6restmvc.entities.Beer; import guru.springframework.spring6restmvc.model.BeerStyle; +import jakarta.validation.ConstraintViolationException; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; @@ -9,6 +10,7 @@ import java.math.BigDecimal; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest class BeerRepositoryTest { @@ -16,6 +18,21 @@ class BeerRepositoryTest { @Autowired BeerRepository beerRepository; + @Test + void testSaveBeerNameTooLong() { + + assertThrows(ConstraintViolationException.class, () -> { + Beer savedBeer = beerRepository.save(Beer.builder() + .beerName("My Beer 0123345678901233456789012334567890123345678901233456789012334567890123345678901233456789") + .beerStyle(BeerStyle.PALE_ALE) + .upc("234234234234") + .price(new BigDecimal("11.99")) + .build()); + + beerRepository.flush(); + }); + } + @Test void testSaveBeer() { Beer savedBeer = beerRepository.save(Beer.builder() From fbc53928d3cb903d6ec9aac2ca01a367cda9bd8a Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 13:09:35 -0400 Subject: [PATCH 070/114] adding JPA controller test --- .../controller/BeerControllerIT.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index 734c4ba78..edce2b8a8 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -1,22 +1,32 @@ package guru.springframework.spring6restmvc.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import guru.springframework.spring6restmvc.entities.Beer; import guru.springframework.spring6restmvc.mappers.BeerMapper; import guru.springframework.spring6restmvc.model.BeerDTO; import guru.springframework.spring6restmvc.repositories.BeerRepository; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpStatusCode; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.Rollback; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.context.WebApplicationContext; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest class BeerControllerIT { @@ -29,6 +39,33 @@ class BeerControllerIT { @Autowired BeerMapper beerMapper; + @Autowired + ObjectMapper objectMapper; + + @Autowired + WebApplicationContext wac; + + MockMvc mockMvc; + + @BeforeEach + void setUp() { + mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); + } + + @Test + void testPatchBeerBadName() throws Exception { + Beer beer = beerRepository.findAll().get(0); + + Map beerMap = new HashMap<>(); + beerMap.put("beerName", "New Name 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); + + mockMvc.perform(patch(BeerController.BEER_PATH_ID, beer.getId()) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(beerMap))) + .andExpect(status().isBadRequest()); + + } @Test void testDeleteByIDNotFound() { From 830efe4c2c7c4a29a5bdfc4fc17d916bdc1ff053 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 13:14:45 -0400 Subject: [PATCH 071/114] adding JPA violation Exception handler --- .../spring6restmvc/controller/CustomErrorController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java index 51578fd9b..af718f8a6 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java @@ -1,6 +1,7 @@ package guru.springframework.spring6restmvc.controller; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.TransactionSystemException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -16,6 +17,11 @@ @ControllerAdvice public class CustomErrorController { + @ExceptionHandler + ResponseEntity handleJPAViolations(TransactionSystemException exception){ + return ResponseEntity.badRequest().build(); + } + @ExceptionHandler(MethodArgumentNotValidException.class) ResponseEntity handleBindErrors(MethodArgumentNotValidException exception){ From 46f85cc6950cfb2100b7fa3c1ee0da2adc48d134 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 13:26:51 -0400 Subject: [PATCH 072/114] adding error message data --- .../controller/CustomErrorController.java | 18 +++++++++++++++++- .../controller/BeerControllerIT.java | 10 ++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java index af718f8a6..683aacd74 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java @@ -1,5 +1,6 @@ package guru.springframework.spring6restmvc.controller; +import jakarta.validation.ConstraintViolationException; import org.springframework.http.ResponseEntity; import org.springframework.transaction.TransactionSystemException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -19,7 +20,22 @@ public class CustomErrorController { @ExceptionHandler ResponseEntity handleJPAViolations(TransactionSystemException exception){ - return ResponseEntity.badRequest().build(); + ResponseEntity.BodyBuilder responseEntity = ResponseEntity.badRequest(); + + if (exception.getCause().getCause() instanceof ConstraintViolationException){ + ConstraintViolationException ve = (ConstraintViolationException) exception.getCause().getCause(); + + List errors = ve.getConstraintViolations().stream() + .map(constraintViolation -> { + Map errMap = new HashMap<>(); + errMap.put(constraintViolation.getPropertyPath().toString(), + constraintViolation.getMessage()); + return errMap; + }).collect(Collectors.toList()); + return responseEntity.body(errors); + } + + return responseEntity.build(); } @ExceptionHandler(MethodArgumentNotValidException.class) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index edce2b8a8..e699e58c4 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -14,6 +14,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.Rollback; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.WebApplicationContext; @@ -24,8 +25,10 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.core.Is.is; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @@ -59,12 +62,15 @@ void testPatchBeerBadName() throws Exception { Map beerMap = new HashMap<>(); beerMap.put("beerName", "New Name 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); - mockMvc.perform(patch(BeerController.BEER_PATH_ID, beer.getId()) + MvcResult result = mockMvc.perform(patch(BeerController.BEER_PATH_ID, beer.getId()) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beerMap))) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.length()", is(1))) + .andReturn(); + System.out.println(result.getResponse().getContentAsString()); } @Test From 76a00a73d3ff28cbd54eefd1f66cf3c4c6f541d6 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 13:30:27 -0400 Subject: [PATCH 073/114] adding error message data --- .../java/guru/springframework/spring6restmvc/model/BeerDTO.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java index af858bfed..556a94056 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerDTO.java @@ -34,4 +34,5 @@ public class BeerDTO { private BigDecimal price; private LocalDateTime createdDate; private LocalDateTime updateDate; + } From 169e35b22fdfcf74083d6eee311e3d4606747019 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 21 Aug 2022 13:31:18 -0400 Subject: [PATCH 074/114] Revert "adding error message data" This reverts commit 46f85cc6950cfb2100b7fa3c1ee0da2adc48d134. --- .../controller/CustomErrorController.java | 18 +----------------- .../controller/BeerControllerIT.java | 10 ++-------- 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java index 683aacd74..af718f8a6 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/CustomErrorController.java @@ -1,6 +1,5 @@ package guru.springframework.spring6restmvc.controller; -import jakarta.validation.ConstraintViolationException; import org.springframework.http.ResponseEntity; import org.springframework.transaction.TransactionSystemException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -20,22 +19,7 @@ public class CustomErrorController { @ExceptionHandler ResponseEntity handleJPAViolations(TransactionSystemException exception){ - ResponseEntity.BodyBuilder responseEntity = ResponseEntity.badRequest(); - - if (exception.getCause().getCause() instanceof ConstraintViolationException){ - ConstraintViolationException ve = (ConstraintViolationException) exception.getCause().getCause(); - - List errors = ve.getConstraintViolations().stream() - .map(constraintViolation -> { - Map errMap = new HashMap<>(); - errMap.put(constraintViolation.getPropertyPath().toString(), - constraintViolation.getMessage()); - return errMap; - }).collect(Collectors.toList()); - return responseEntity.body(errors); - } - - return responseEntity.build(); + return ResponseEntity.badRequest().build(); } @ExceptionHandler(MethodArgumentNotValidException.class) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index e699e58c4..edce2b8a8 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -14,7 +14,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.Rollback; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.WebApplicationContext; @@ -25,10 +24,8 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.core.Is.is; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @@ -62,15 +59,12 @@ void testPatchBeerBadName() throws Exception { Map beerMap = new HashMap<>(); beerMap.put("beerName", "New Name 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); - MvcResult result = mockMvc.perform(patch(BeerController.BEER_PATH_ID, beer.getId()) + mockMvc.perform(patch(BeerController.BEER_PATH_ID, beer.getId()) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(beerMap))) - .andExpect(status().isBadRequest()) - .andExpect(jsonPath("$.length()", is(1))) - .andReturn(); + .andExpect(status().isBadRequest()); - System.out.println(result.getResponse().getContentAsString()); } @Test From b45923859446cacc8f774333a44ef31eb158547c Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 27 Aug 2022 13:35:00 -0400 Subject: [PATCH 075/114] adding init scripts for MySQL --- src/scripts/mysql-init.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/scripts/mysql-init.sql diff --git a/src/scripts/mysql-init.sql b/src/scripts/mysql-init.sql new file mode 100644 index 000000000..84ccd80c2 --- /dev/null +++ b/src/scripts/mysql-init.sql @@ -0,0 +1,6 @@ +DROP DATABASE IF EXISTS restdb; +DROP USER IF EXISTS `restadmin`@`%`; +CREATE DATABASE IF NOT EXISTS restdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE USER IF NOT EXISTS `restadmin`@`%` IDENTIFIED WITH mysql_native_password BY 'password'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, EXECUTE, CREATE VIEW, SHOW VIEW, +CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `restdb`.* TO `restadmin`@`%`; \ No newline at end of file From 6da72117300511f79775be4de9a422824a99e86e Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 27 Aug 2022 13:48:41 -0400 Subject: [PATCH 076/114] adding deps for mysql --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index fb1a9341e..c99947b24 100644 --- a/pom.xml +++ b/pom.xml @@ -34,9 +34,14 @@ org.springframework.boot spring-boot-starter-data-jpa + + mysql + mysql-connector-java + com.h2database h2 + runtime From 974bcc095fa2768d3f394a086fc6bcda348697db Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 27 Aug 2022 14:20:18 -0400 Subject: [PATCH 077/114] adding mysql local profile --- src/main/resources/application-localmysql.properties | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/resources/application-localmysql.properties diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties new file mode 100644 index 000000000..5d382c415 --- /dev/null +++ b/src/main/resources/application-localmysql.properties @@ -0,0 +1,6 @@ +spring.datasource.username=restadmin +spring.datasource.password=password +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/restdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC +spring.jpa.database=mysql +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect From 719d6f0e9cbef3a65809d229187913ec223df419 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 27 Aug 2022 14:29:43 -0400 Subject: [PATCH 078/114] add log output of SQL --- src/main/resources/application-localmysql.properties | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties index 5d382c415..f49d859e7 100644 --- a/src/main/resources/application-localmysql.properties +++ b/src/main/resources/application-localmysql.properties @@ -4,3 +4,10 @@ spring.datasource.url=jdbc:mysql://127.0.0.1:3306/restdb?useUnicode=true&charact spring.jpa.database=mysql spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect +spring.jpa.hibernate.ddl-auto=update + +#Show SQL +spring.jpa.properties.hibernate.show_sql=true + +#Format SQL +spring.jpa.properties.hibernate.format_sql=true \ No newline at end of file From 918274f739851971a7338b8baaedb03362c36ed6 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 27 Aug 2022 14:46:57 -0400 Subject: [PATCH 079/114] updating JPA mappings --- .../guru/springframework/spring6restmvc/entities/Beer.java | 5 ++++- .../springframework/spring6restmvc/entities/Customer.java | 5 ++++- src/main/resources/application-localmysql.properties | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index a007e2d54..598d91e3a 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -7,6 +7,8 @@ import jakarta.validation.constraints.Size; import lombok.*; import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -26,7 +28,8 @@ public class Beer { @Id @GeneratedValue(generator = "UUID") @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") - @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) + @JdbcTypeCode(SqlTypes.CHAR) + @Column(length = 36, columnDefinition = "varchar(36)", updatable = false, nullable = false) private UUID id; @Version diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java index c9d6f1c4f..d12166f52 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -3,6 +3,8 @@ import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; import java.time.LocalDateTime; import java.util.UUID; @@ -20,7 +22,8 @@ public class Customer { @Id @GeneratedValue(generator = "UUID") @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") - @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) + @JdbcTypeCode(SqlTypes.CHAR) + @Column(length = 36, columnDefinition = "varchar(36)", updatable = false, nullable = false) private UUID id; private String name; diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties index f49d859e7..ec8c05448 100644 --- a/src/main/resources/application-localmysql.properties +++ b/src/main/resources/application-localmysql.properties @@ -10,4 +10,7 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.show_sql=true #Format SQL -spring.jpa.properties.hibernate.format_sql=true \ No newline at end of file +spring.jpa.properties.hibernate.format_sql=true + +#Show bind values +logging.level.org.hibernate.orm.jdbc.bind=trace \ No newline at end of file From b8241440486ddf7efa775e445dd047f76f97d40c Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 27 Aug 2022 15:08:18 -0400 Subject: [PATCH 080/114] adding Hikari config --- .../resources/application-localmysql.properties | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties index ec8c05448..a560519b0 100644 --- a/src/main/resources/application-localmysql.properties +++ b/src/main/resources/application-localmysql.properties @@ -6,6 +6,20 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update +spring.datasource.hikari.pool-name=RestDB-Pool +spring.datasource.hikari.maximum-pool-size=5 +spring.datasource.hikari.data-source-properties.cachePrepStmts=true +spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250 +spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=2048 +spring.datasource.hikari.data-source-properties.useServerPrepStmts=true +spring.datasource.hikari.data-source-properties.useLocalSessionState=true +spring.datasource.hikari.data-source-properties.rewriteBatchedStatements=true +spring.datasource.hikari.data-source-properties.cacheResultSetMetadata=true +spring.datasource.hikari.data-source-properties.cacheServerConfiguration=true +spring.datasource.hikari.data-source-properties.elideSetAutoCommits=true +spring.datasource.hikari.data-source-properties.maintainTimeStats=false + + #Show SQL spring.jpa.properties.hibernate.show_sql=true From dd360d8cdfb38e8307d9d7e7a311abfff894f150 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 29 Aug 2022 09:49:48 -0400 Subject: [PATCH 081/114] adding db script create properties --- src/main/resources/application.properties | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d0afd80b5..6405ef234 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,2 +1,8 @@ logging.level.guru.springframework=debug + + +#spring.jpa.properties.jakarta.persistence.schema-generation.scripts.action=drop-and-create +#spring.jpa.properties.jakarta.persistence.schema-generation.scripts.create-source=metadata +#spring.jpa.properties.jakarta.persistence.schema-generation.scripts.drop-target=drop-and-create.sql +#spring.jpa.properties.jakarta.persistence.schema-generation.scripts.create-target=drop-and-create.sql \ No newline at end of file From adac3e1456797de7e3cb35cf35c1af271aa1f1f2 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 2 Oct 2022 12:43:50 -0400 Subject: [PATCH 082/114] adding flyway deps --- pom.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c99947b24..2d8eed700 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,10 @@ h2 runtime - + + org.flywaydb + flyway-mysql + org.projectlombok lombok From e42e6cd8c8f5a789c385787ffab98714421f2bf1 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 2 Oct 2022 13:01:28 -0400 Subject: [PATCH 083/114] adding flyway init script --- .../application-localmysql.properties | 2 +- .../db/migration/V1__init-mysql-database.sql | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/db/migration/V1__init-mysql-database.sql diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties index a560519b0..31f26ea2f 100644 --- a/src/main/resources/application-localmysql.properties +++ b/src/main/resources/application-localmysql.properties @@ -4,7 +4,7 @@ spring.datasource.url=jdbc:mysql://127.0.0.1:3306/restdb?useUnicode=true&charact spring.jpa.database=mysql spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=validate spring.datasource.hikari.pool-name=RestDB-Pool spring.datasource.hikari.maximum-pool-size=5 diff --git a/src/main/resources/db/migration/V1__init-mysql-database.sql b/src/main/resources/db/migration/V1__init-mysql-database.sql new file mode 100644 index 000000000..d552de01d --- /dev/null +++ b/src/main/resources/db/migration/V1__init-mysql-database.sql @@ -0,0 +1,26 @@ + + drop table if exists beer; + + drop table if exists customer; + + create table beer ( + id varchar(36) not null, + beer_name varchar(50) not null, + beer_style smallint not null, + created_date datetime(6), + price decimal(38,2) not null, + quantity_on_hand integer, + upc varchar(255) not null, + update_date datetime(6), + version integer, + primary key (id) + ) engine=InnoDB; + + create table customer ( + id varchar(36) not null, + created_date datetime(6), + name varchar(255), + update_date datetime(6), + version integer, + primary key (id) + ) engine=InnoDB; From 77e322cb5c3f63806ab9c589662a517517c9724a Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 2 Oct 2022 13:17:31 -0400 Subject: [PATCH 084/114] add db column using flyway --- .../guru/springframework/spring6restmvc/entities/Customer.java | 3 +++ src/main/resources/db/migration/V2__add-email-to-customer.sql | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 src/main/resources/db/migration/V2__add-email-to-customer.sql diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java index d12166f52..9532831bf 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -27,6 +27,9 @@ public class Customer { private UUID id; private String name; + @Column(length = 255) + private String email; + @Version private Integer version; private LocalDateTime createdDate; diff --git a/src/main/resources/db/migration/V2__add-email-to-customer.sql b/src/main/resources/db/migration/V2__add-email-to-customer.sql new file mode 100644 index 000000000..16c22565f --- /dev/null +++ b/src/main/resources/db/migration/V2__add-email-to-customer.sql @@ -0,0 +1,2 @@ +alter table customer +add column email varchar(255); \ No newline at end of file From 6d9a20901562727edec268ae15d675f18e331e40 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 2 Oct 2022 14:00:09 -0400 Subject: [PATCH 085/114] adding csv data --- src/main/resources/csvdata/LICENSE | 21 + src/main/resources/csvdata/README.md | 5 + src/main/resources/csvdata/beers.csv | 2411 ++++++++++++++++++++++++++ 3 files changed, 2437 insertions(+) create mode 100644 src/main/resources/csvdata/LICENSE create mode 100644 src/main/resources/csvdata/README.md create mode 100644 src/main/resources/csvdata/beers.csv diff --git a/src/main/resources/csvdata/LICENSE b/src/main/resources/csvdata/LICENSE new file mode 100644 index 000000000..98347e481 --- /dev/null +++ b/src/main/resources/csvdata/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Plotly + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/src/main/resources/csvdata/README.md b/src/main/resources/csvdata/README.md new file mode 100644 index 000000000..be7456c28 --- /dev/null +++ b/src/main/resources/csvdata/README.md @@ -0,0 +1,5 @@ +# Original Source +Data originally provided via [Plotly GitHub Repository](https://github.com/plotly/datasets) under MIT license. + +Duplicated here for your convenience. +* [Original file](https://github.com/plotly/datasets/blob/master/beers.csv) \ No newline at end of file diff --git a/src/main/resources/csvdata/beers.csv b/src/main/resources/csvdata/beers.csv new file mode 100644 index 000000000..0eee91f05 --- /dev/null +++ b/src/main/resources/csvdata/beers.csv @@ -0,0 +1,2411 @@ +"","count.x","abv","ibu","id","beer","style","brewery_id","ounces","style2","count.y","brewery","city","state","label" +"1",1,0.05,NA,1436,"Pub Beer","American Pale Lager",408,12,NA,409,"10 Barrel Brewing Company","Bend","OR","Pub Beer (10 Barrel Brewing Company)" +"2",2,0.066,NA,2265,"Devil's Cup","American Pale Ale (APA)",177,12,"American Pale Ale (APA)",178,"18th Street Brewery","Gary","IN","Devil's Cup (18th Street Brewery)" +"3",3,0.071,NA,2264,"Rise of the Phoenix","American IPA",177,12,"American IPA",178,"18th Street Brewery","Gary","IN","Rise of the Phoenix (18th Street Brewery)" +"4",4,0.09,NA,2263,"Sinister","American Double / Imperial IPA",177,12,"American Double / Imperial IPA",178,"18th Street Brewery","Gary","IN","Sinister (18th Street Brewery)" +"5",5,0.075,NA,2262,"Sex and Candy","American IPA",177,12,"American IPA",178,"18th Street Brewery","Gary","IN","Sex and Candy (18th Street Brewery)" +"6",6,0.077,NA,2261,"Black Exodus","Oatmeal Stout",177,12,NA,178,"18th Street Brewery","Gary","IN","Black Exodus (18th Street Brewery)" +"7",7,0.045,NA,2260,"Lake Street Express","American Pale Ale (APA)",177,12,"American Pale Ale (APA)",178,"18th Street Brewery","Gary","IN","Lake Street Express (18th Street Brewery)" +"8",8,0.065,NA,2259,"Foreman","American Porter",177,12,NA,178,"18th Street Brewery","Gary","IN","Foreman (18th Street Brewery)" +"9",9,0.055,NA,2258,"Jade","American Pale Ale (APA)",177,12,"American Pale Ale (APA)",178,"18th Street Brewery","Gary","IN","Jade (18th Street Brewery)" +"10",10,0.086,NA,2131,"Cone Crusher","American Double / Imperial IPA",177,12,"American Double / Imperial IPA",178,"18th Street Brewery","Gary","IN","Cone Crusher (18th Street Brewery)" +"11",11,0.072,NA,2099,"Sophomoric Saison","Saison / Farmhouse Ale",177,12,NA,178,"18th Street Brewery","Gary","IN","Sophomoric Saison (18th Street Brewery)" +"12",12,0.073,NA,2098,"Regional Ring Of Fire","Saison / Farmhouse Ale",177,12,NA,178,"18th Street Brewery","Gary","IN","Regional Ring Of Fire (18th Street Brewery)" +"13",13,0.069,NA,2097,"Garce Selé","Saison / Farmhouse Ale",177,12,NA,178,"18th Street Brewery","Gary","IN","Garce Selé (18th Street Brewery)" +"14",14,0.085,NA,1980,"Troll Destroyer","Belgian IPA",177,12,NA,178,"18th Street Brewery","Gary","IN","Troll Destroyer (18th Street Brewery)" +"15",15,0.061,60,1979,"Bitter Bitch","American Pale Ale (APA)",177,12,"American Pale Ale (APA)",178,"18th Street Brewery","Gary","IN","Bitter Bitch (18th Street Brewery)" +"16",16,0.06,NA,2318,"Ginja Ninja","Cider",154,12,NA,155,"2 Towns Ciderhouse","Corvallis","OR","Ginja Ninja (2 Towns Ciderhouse)" +"17",17,0.06,NA,2170,"Cherried Away","Cider",154,12,NA,155,"2 Towns Ciderhouse","Corvallis","OR","Cherried Away (2 Towns Ciderhouse)" +"18",18,0.06,NA,2169,"Rhubarbarian","Cider",154,12,NA,155,"2 Towns Ciderhouse","Corvallis","OR","Rhubarbarian (2 Towns Ciderhouse)" +"19",19,0.06,NA,1502,"BrightCider","Cider",154,12,NA,155,"2 Towns Ciderhouse","Corvallis","OR","BrightCider (2 Towns Ciderhouse)" +"20",20,0.0819999999999999,NA,1593,"He Said Baltic-Style Porter","Baltic Porter",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","He Said Baltic-Style Porter (21st Amendment Brewery)" +"21",21,0.0819999999999999,NA,1592,"He Said Belgian-Style Tripel","Tripel",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","He Said Belgian-Style Tripel (21st Amendment Brewery)" +"22",22,0.099,92,1036,"Lower De Boom","American Barleywine",368,8.4,NA,369,"21st Amendment Brewery","San Francisco","CA","Lower De Boom (21st Amendment Brewery)" +"23",23,0.079,45,1024,"Fireside Chat","Winter Warmer",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Fireside Chat (21st Amendment Brewery)" +"24",24,0.079,NA,976,"Marooned On Hog Island","American Stout",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Marooned On Hog Island (21st Amendment Brewery)" +"25",25,0.044,42,876,"Bitter American","American Pale Ale (APA)",368,12,"American Pale Ale (APA)",369,"21st Amendment Brewery","San Francisco","CA","Bitter American (21st Amendment Brewery)" +"26",26,0.049,17,802,"Hell or High Watermelon Wheat (2009)","Fruit / Vegetable Beer",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Hell or High Watermelon Wheat (2009) (21st Amendment Brewery)" +"27",27,0.049,17,801,"Hell or High Watermelon Wheat (2009)","Fruit / Vegetable Beer",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Hell or High Watermelon Wheat (2009) (21st Amendment Brewery)" +"28",28,0.049,17,800,"21st Amendment Watermelon Wheat Beer (2006)","Fruit / Vegetable Beer",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","21st Amendment Watermelon Wheat Beer (2006) (21st Amendment Brewery)" +"29",29,0.07,70,799,"21st Amendment IPA (2006)","American IPA",368,12,"American IPA",369,"21st Amendment Brewery","San Francisco","CA","21st Amendment IPA (2006) (21st Amendment Brewery)" +"30",30,0.07,70,797,"Brew Free! or Die IPA (2008)","American IPA",368,12,"American IPA",369,"21st Amendment Brewery","San Francisco","CA","Brew Free! or Die IPA (2008) (21st Amendment Brewery)" +"31",31,0.07,70,796,"Brew Free! or Die IPA (2009)","American IPA",368,12,"American IPA",369,"21st Amendment Brewery","San Francisco","CA","Brew Free! or Die IPA (2009) (21st Amendment Brewery)" +"32",32,0.085,52,531,"Special Edition: Allies Win The War!","English Strong Ale",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Special Edition: Allies Win The War! (21st Amendment Brewery)" +"33",33,0.0969999999999999,94,432,"Hop Crisis","American Double / Imperial IPA",368,12,"American Double / Imperial IPA",369,"21st Amendment Brewery","San Francisco","CA","Hop Crisis (21st Amendment Brewery)" +"34",34,0.044,42,353,"Bitter American (2011)","American Pale Ale (APA)",368,12,"American Pale Ale (APA)",369,"21st Amendment Brewery","San Francisco","CA","Bitter American (2011) (21st Amendment Brewery)" +"35",35,0.079,45,321,"Fireside Chat (2010)","Winter Warmer",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Fireside Chat (2010) (21st Amendment Brewery)" +"36",36,0.068,65,173,"Back in Black","American Black Ale",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Back in Black (21st Amendment Brewery)" +"37",37,0.083,35,11,"Monk's Blood","Belgian Dark Ale",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Monk's Blood (21st Amendment Brewery)" +"38",38,0.07,65,10,"Brew Free! or Die IPA","American IPA",368,12,"American IPA",369,"21st Amendment Brewery","San Francisco","CA","Brew Free! or Die IPA (21st Amendment Brewery)" +"39",39,0.049,17,9,"Hell or High Watermelon Wheat","Fruit / Vegetable Beer",368,12,NA,369,"21st Amendment Brewery","San Francisco","CA","Hell or High Watermelon Wheat (21st Amendment Brewery)" +"40",40,0.07,82,2519,"Bimini Twist","American IPA",67,12,"American IPA",68,"3 Daughters Brewing","St Petersburg","FL","Bimini Twist (3 Daughters Brewing)" +"41",41,0.05,NA,2518,"Beach Blonde","American Blonde Ale",67,12,"American Blonde Ale",68,"3 Daughters Brewing","St Petersburg","FL","Beach Blonde (3 Daughters Brewing)" +"42",42,0.059,NA,2517,"Rod Bender Red","American Amber / Red Ale",67,12,"American Amber / Red Ale",68,"3 Daughters Brewing","St Petersburg","FL","Rod Bender Red (3 Daughters Brewing)" +"43",43,0.035,11,2545,"Passion Fruit Prussia","Berliner Weissbier",60,12,NA,61,"4 Hands Brewing Company","Saint Louis","MO","Passion Fruit Prussia (4 Hands Brewing Company)" +"44",44,0.045,18,2544,"Send Help","American Blonde Ale",60,12,"American Blonde Ale",61,"4 Hands Brewing Company","Saint Louis","MO","Send Help (4 Hands Brewing Company)" +"45",45,0.055,NA,2324,"Cast Iron Oatmeal Brown","American Brown Ale",60,12,NA,61,"4 Hands Brewing Company","Saint Louis","MO","Cast Iron Oatmeal Brown (4 Hands Brewing Company)" +"46",46,0.06,NA,2288,"Reprise Centennial Red","American Amber / Red Ale",60,12,"American Amber / Red Ale",61,"4 Hands Brewing Company","Saint Louis","MO","Reprise Centennial Red (4 Hands Brewing Company)" +"47",47,0.055,NA,2287,"Alter Ego","American Black Ale",60,12,NA,61,"4 Hands Brewing Company","Saint Louis","MO","Alter Ego (4 Hands Brewing Company)" +"48",48,0.065,NA,2286,"Divided Sky","American IPA",60,12,"American IPA",61,"4 Hands Brewing Company","Saint Louis","MO","Divided Sky (4 Hands Brewing Company)" +"49",49,0.065,NA,2285,"Resurrected","American IPA",60,12,"American IPA",61,"4 Hands Brewing Company","Saint Louis","MO","Resurrected (4 Hands Brewing Company)" +"50",50,0.05,28,1870,"Contact High","American Pale Wheat Ale",60,12,"American Pale Wheat Ale",61,"4 Hands Brewing Company","Saint Louis","MO","Contact High (4 Hands Brewing Company)" +"51",51,0.065,NA,2603,"Galaxyfest","American IPA",27,16,"American IPA",28,"450 North Brewing Company","Columbus","IN","Galaxyfest (450 North Brewing Company)" +"52",52,0.05,45,2602,"Citrafest","American IPA",27,16,"American IPA",28,"450 North Brewing Company","Columbus","IN","Citrafest (450 North Brewing Company)" +"53",53,0.09,NA,2220,"Barn Yeti","Belgian Strong Dark Ale",27,16,NA,28,"450 North Brewing Company","Columbus","IN","Barn Yeti (450 North Brewing Company)" +"54",54,0.069,65,2219,"Scarecrow","American IPA",27,16,"American IPA",28,"450 North Brewing Company","Columbus","IN","Scarecrow (450 North Brewing Company)" +"55",55,0.09,50,2218,"Ironman","English Strong Ale",27,16,NA,28,"450 North Brewing Company","Columbus","IN","Ironman (450 North Brewing Company)" +"56",56,0.046,15,2217,"Honey Kolsch","Kölsch",27,16,NA,28,"450 North Brewing Company","Columbus","IN","Honey Kolsch (450 North Brewing Company)" +"57",57,0.052,18,2216,"Copperhead Amber","Belgian Dark Ale",27,16,NA,28,"450 North Brewing Company","Columbus","IN","Copperhead Amber (450 North Brewing Company)" +"58",58,0.059,75,972,"Rude Parrot IPA","American IPA",481,16,"American IPA",482,"7 Seas Brewing Company","Gig Harbor","WA","Rude Parrot IPA (7 Seas Brewing Company)" +"59",59,0.054,30,866,"British Pale Ale (2010)","English Pale Ale",481,16,NA,482,"7 Seas Brewing Company","Gig Harbor","WA","British Pale Ale (2010) (7 Seas Brewing Company)" +"60",60,0.054,30,48,"British Pale Ale","English Pale Ale",481,16,NA,482,"7 Seas Brewing Company","Gig Harbor","WA","British Pale Ale (7 Seas Brewing Company)" +"61",61,0.084,82,47,"Ballz Deep Double IPA","American Double / Imperial IPA",481,16,"American Double / Imperial IPA",482,"7 Seas Brewing Company","Gig Harbor","WA","Ballz Deep Double IPA (7 Seas Brewing Company)" +"62",62,0.038,NA,1583,"Wolfman's Berliner","Berliner Weissbier",373,12,NA,374,"7venth Sun","Dunedin","FL","Wolfman's Berliner (7venth Sun)" +"63",63,0.055,26,1165,"Colorado Native","American Amber / Red Lager",462,12,NA,463,"AC Golden Brewing Company","Golden","CO","Colorado Native (AC Golden Brewing Company)" +"64",64,0.055,26,431,"Colorado Native (2011)","American Amber / Red Lager",462,12,NA,463,"AC Golden Brewing Company","Golden","CO","Colorado Native (2011) (AC Golden Brewing Company)" +"65",65,0.065,52,516,"Jockamo IPA","American IPA",533,12,"American IPA",534,"Abita Brewing Company","Abita Springs","LA","Jockamo IPA (Abita Brewing Company)" +"66",66,0.042,13,515,"Purple Haze","Fruit / Vegetable Beer",533,12,NA,534,"Abita Brewing Company","Abita Springs","LA","Purple Haze (Abita Brewing Company)" +"67",67,0.045,17,514,"Abita Amber","American Amber / Red Lager",533,12,NA,534,"Abita Brewing Company","Abita Springs","LA","Abita Amber (Abita Brewing Company)" +"68",68,0.0819999999999999,68,2540,"Citra Ass Down","American IPA",62,16,"American IPA",63,"Against The Grain Brewery","Louisville","KY","Citra Ass Down (Against The Grain Brewery)" +"69",69,0.05,20,2539,"The Brown Note","American Brown Ale",62,16,NA,63,"Against The Grain Brewery","Louisville","KY","The Brown Note (Against The Grain Brewery)" +"70",70,0.08,68,2686,"Citra Ass Down","American Double / Imperial IPA",1,16,"American Double / Imperial IPA",2,"Against the Grain Brewery","Louisville","KY","Citra Ass Down (Against the Grain Brewery)" +"71",71,0.125,80,2685,"London Balling","English Barleywine",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","London Balling (Against the Grain Brewery)" +"72",72,0.077,25,2684,"35 K","Milk / Sweet Stout",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","35 K (Against the Grain Brewery)" +"73",73,0.042,42,2683,"A Beer","American Pale Ale (APA)",1,16,"American Pale Ale (APA)",2,"Against the Grain Brewery","Louisville","KY","A Beer (Against the Grain Brewery)" +"74",74,0.05,25,2682,"Rules are Rules","German Pilsener",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","Rules are Rules (Against the Grain Brewery)" +"75",75,0.066,21,2681,"Flesh Gourd'n","Pumpkin Ale",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","Flesh Gourd'n (Against the Grain Brewery)" +"76",76,0.04,13,2680,"Sho'nuff","Belgian Pale Ale",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","Sho'nuff (Against the Grain Brewery)" +"77",77,0.055,17,2679,"Bloody Show","American Pilsner",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","Bloody Show (Against the Grain Brewery)" +"78",78,0.076,68,2678,"Rico Sauvin","American Double / Imperial IPA",1,16,"American Double / Imperial IPA",2,"Against the Grain Brewery","Louisville","KY","Rico Sauvin (Against the Grain Brewery)" +"79",79,0.051,38,2677,"Coq de la Marche","Saison / Farmhouse Ale",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","Coq de la Marche (Against the Grain Brewery)" +"80",80,0.065,NA,2676,"Kamen Knuddeln","American Wild Ale",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","Kamen Knuddeln (Against the Grain Brewery)" +"81",81,0.06,65,2675,"Pile of Face","American IPA",1,16,"American IPA",2,"Against the Grain Brewery","Louisville","KY","Pile of Face (Against the Grain Brewery)" +"82",82,0.05,20,2674,"The Brown Note","English Brown Ale",1,16,NA,2,"Against the Grain Brewery","Louisville","KY","The Brown Note (Against the Grain Brewery)" +"83",83,0.053,35,1594,"Maylani's Coconut Stout","American Stout",367,16,NA,368,"Airways Brewing Company","Kent","WA","Maylani's Coconut Stout (Airways Brewing Company)" +"84",84,0.05,35,1162,"Oatmeal PSA","American Pale Ale (APA)",367,16,"American Pale Ale (APA)",368,"Airways Brewing Company","Kent","WA","Oatmeal PSA (Airways Brewing Company)" +"85",85,0.052,33,1137,"Pre Flight Pilsner","American Pilsner",367,16,NA,368,"Airways Brewing Company","Kent","WA","Pre Flight Pilsner (Airways Brewing Company)" +"86",86,0.04,20,2403,"P-Town Pilsner","American Pilsner",117,12,NA,118,"Alameda Brewing","Portland","OR","P-Town Pilsner (Alameda Brewing)" +"87",87,0.053,36,2402,"Klickitat Pale Ale","American Pale Ale (APA)",117,12,"American Pale Ale (APA)",118,"Alameda Brewing","Portland","OR","Klickitat Pale Ale (Alameda Brewing)" +"88",88,0.0819999999999999,103,2401,"Yellow Wolf Imperial IPA","American Double / Imperial IPA",117,12,"American Double / Imperial IPA",118,"Alameda Brewing","Portland","OR","Yellow Wolf Imperial IPA (Alameda Brewing)" +"89",89,0.053,40,1921,"Freeride APA","American Pale Ale (APA)",270,12,"American Pale Ale (APA)",271,"Alaskan Brewing Company","Juneau","AK","Freeride APA (Alaskan Brewing Company)" +"90",90,0.053,18,1920,"Alaskan Amber","Altbier",270,12,NA,271,"Alaskan Brewing Company","Juneau","AK","Alaskan Amber (Alaskan Brewing Company)" +"91",91,0.057,NA,2501,"Hopalicious","American Pale Ale (APA)",73,12,"American Pale Ale (APA)",74,"Ale Asylum","Madison","WI","Hopalicious (Ale Asylum)" +"92",92,0.043,NA,1535,"Kentucky Kölsch","Kölsch",388,16,NA,389,"Alltech's Lexington Brewing Company","Lexington","KY","Kentucky Kölsch (Alltech's Lexington Brewing Company)" +"93",93,0.065,NA,1149,"Kentucky IPA","American IPA",388,16,"American IPA",389,"Alltech's Lexington Brewing Company","Lexington","KY","Kentucky IPA (Alltech's Lexington Brewing Company)" +"94",94,0.054,NA,1474,"Dusty Trail Pale Ale","American Pale Ale (APA)",401,16,"American Pale Ale (APA)",402,"Amnesia Brewing Company","Washougal","WA","Dusty Trail Pale Ale (Amnesia Brewing Company)" +"95",95,0.062,NA,1473,"Damnesia","American IPA",401,16,"American IPA",402,"Amnesia Brewing Company","Washougal","WA","Damnesia (Amnesia Brewing Company)" +"96",96,0.062,43,837,"Desolation IPA","American IPA",401,16,"American IPA",402,"Amnesia Brewing Company","Washougal","WA","Desolation IPA (Amnesia Brewing Company)" +"97",97,0.059,NA,2592,"Liberty Ale","American IPA",35,12,"American IPA",36,"Anchor Brewing Company","San Francisco","CA","Liberty Ale (Anchor Brewing Company)" +"98",98,0.065,NA,2578,"IPA","American IPA",35,12,"American IPA",36,"Anchor Brewing Company","San Francisco","CA","IPA (Anchor Brewing Company)" +"99",99,0.045,NA,2577,"Summer Wheat","American Pale Wheat Ale",35,12,"American Pale Wheat Ale",36,"Anchor Brewing Company","San Francisco","CA","Summer Wheat (Anchor Brewing Company)" +"100",100,0.049,NA,2103,"California Lager","American Amber / Red Lager",35,12,NA,36,"Anchor Brewing Company","San Francisco","CA","California Lager (Anchor Brewing Company)" +"101",101,0.0559999999999999,NA,2102,"Brotherhood Steam","California Common / Steam Beer",35,12,NA,36,"Anchor Brewing Company","San Francisco","CA","Brotherhood Steam (Anchor Brewing Company)" +"102",102,0.042,NA,2291,"Blood Orange Gose","Gose",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Blood Orange Gose (Anderson Valley Brewing Company)" +"103",103,0.042,NA,1818,"Keebarlin' Pale Ale","American Pale Ale (APA)",171,12,"American Pale Ale (APA)",172,"Anderson Valley Brewing Company","Boonville","CA","Keebarlin' Pale Ale (Anderson Valley Brewing Company)" +"104",104,0.048,NA,1738,"the Kimmie, the Yink and the Holy Gose","Gose",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","the Kimmie, the Yink and the Holy Gose (Anderson Valley Brewing Company)" +"105",105,0.06,NA,1563,"Fall Hornin'","Pumpkin Ale",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Fall Hornin' (Anderson Valley Brewing Company)" +"106",106,0.057,13,1520,"Barney Flats Oatmeal Stout","Oatmeal Stout",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Barney Flats Oatmeal Stout (Anderson Valley Brewing Company)" +"107",107,0.0559999999999999,4,1350,"Summer Solstice","Cream Ale",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Summer Solstice (Anderson Valley Brewing Company)" +"108",108,0.07,80,1327,"Hop Ottin' IPA","American IPA",171,12,"American IPA",172,"Anderson Valley Brewing Company","Boonville","CA","Hop Ottin' IPA (Anderson Valley Brewing Company)" +"109",109,0.0579999999999999,15,1326,"Boont Amber Ale","American Amber / Red Ale",171,12,"American Amber / Red Ale",172,"Anderson Valley Brewing Company","Boonville","CA","Boont Amber Ale (Anderson Valley Brewing Company)" +"110",110,0.057,13,1221,"Barney Flats Oatmeal Stout","Oatmeal Stout",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Barney Flats Oatmeal Stout (Anderson Valley Brewing Company)" +"111",111,0.055,25,1217,"El Steinber Dark Lager","Vienna Lager",171,16,NA,172,"Anderson Valley Brewing Company","Boonville","CA","El Steinber Dark Lager (Anderson Valley Brewing Company)" +"112",112,0.0579999999999999,15,811,"Boont Amber Ale (2010)","American Amber / Red Ale",171,12,"American Amber / Red Ale",172,"Anderson Valley Brewing Company","Boonville","CA","Boont Amber Ale (2010) (Anderson Valley Brewing Company)" +"113",113,0.0559999999999999,4,753,"Summer Solstice Cerveza Crema (2009)","Cream Ale",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Summer Solstice Cerveza Crema (2009) (Anderson Valley Brewing Company)" +"114",114,0.057,13,572,"Barney Flats Oatmeal Stout (2012)","Oatmeal Stout",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Barney Flats Oatmeal Stout (2012) (Anderson Valley Brewing Company)" +"115",115,0.069,6,523,"Winter Solstice","Winter Warmer",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Winter Solstice (Anderson Valley Brewing Company)" +"116",116,0.07,80,367,"Hop Ottin' IPA (2011)","American IPA",171,12,"American IPA",172,"Anderson Valley Brewing Company","Boonville","CA","Hop Ottin' IPA (2011) (Anderson Valley Brewing Company)" +"117",117,0.0579999999999999,15,78,"Boont Amber Ale (2011)","American Amber / Red Ale",171,12,"American Amber / Red Ale",172,"Anderson Valley Brewing Company","Boonville","CA","Boont Amber Ale (2011) (Anderson Valley Brewing Company)" +"118",118,0.0559999999999999,4,77,"Summer Solstice (2011)","Cream Ale",171,12,NA,172,"Anderson Valley Brewing Company","Boonville","CA","Summer Solstice (2011) (Anderson Valley Brewing Company)" +"119",119,0.055,28,76,"Poleeko Gold Pale Ale (2009)","American Pale Ale (APA)",171,12,"American Pale Ale (APA)",172,"Anderson Valley Brewing Company","Boonville","CA","Poleeko Gold Pale Ale (2009) (Anderson Valley Brewing Company)" +"120",120,0.06,NA,2337,"Charlie's Rye IPA","American IPA",146,16,"American IPA",147,"Angry Minnow","Hayward","WI","Charlie's Rye IPA (Angry Minnow)" +"121",121,0.054,NA,410,"River Pig Pale Ale","American Pale Ale (APA)",542,16,"American Pale Ale (APA)",543,"Angry Minnow Brewing Company","Hayward","WI","River Pig Pale Ale (Angry Minnow Brewing Company)" +"122",122,0.047,NA,409,"Oaky's Oatmeal Stout","Oatmeal Stout",542,16,NA,543,"Angry Minnow Brewing Company","Hayward","WI","Oaky's Oatmeal Stout (Angry Minnow Brewing Company)" +"123",123,0.05,NA,1294,"Angry Orchard Apple Ginger","Cider",434,16,NA,435,"Angry Orchard Cider Company","Cincinnati","OH","Angry Orchard Apple Ginger (Angry Orchard Cider Company)" +"124",124,0.05,NA,1293,"Angry Orchard Crisp Apple","Cider",434,16,NA,435,"Angry Orchard Cider Company","Cincinnati","OH","Angry Orchard Crisp Apple (Angry Orchard Cider Company)" +"125",125,0.05,NA,1292,"Angry Orchard Crisp Apple","Cider",434,12,NA,435,"Angry Orchard Cider Company","Cincinnati","OH","Angry Orchard Crisp Apple (Angry Orchard Cider Company)" +"126",126,0.068,NA,2207,"Golden One","Belgian Pale Ale",193,12,NA,194,"Anthem Brewing Company","Oklahoma City","OK","Golden One (Anthem Brewing Company)" +"127",127,0.06,NA,2040,"Arjuna","Witbier",193,12,NA,194,"Anthem Brewing Company","Oklahoma City","OK","Arjuna (Anthem Brewing Company)" +"128",128,0.085,NA,2039,"Uroboros","American Stout",193,12,NA,194,"Anthem Brewing Company","Oklahoma City","OK","Uroboros (Anthem Brewing Company)" +"129",129,0.071,75,2511,"Long Leaf","American IPA",69,16,"American IPA",70,"Appalachian Mountain Brewery","Boone","NC","Long Leaf (Appalachian Mountain Brewery)" +"130",130,0.047,19,2510,"Honey Badger Blonde","American Blonde Ale",69,16,"American Blonde Ale",70,"Appalachian Mountain Brewery","Boone","NC","Honey Badger Blonde (Appalachian Mountain Brewery)" +"131",131,0.06,23,2509,"Porter (a/k/a Black Gold Porter)","American Porter",69,16,NA,70,"Appalachian Mountain Brewery","Boone","NC","Porter (a/k/a Black Gold Porter) (Appalachian Mountain Brewery)" +"132",132,0.06,55,413,"Sky High Rye","American Pale Ale (APA)",541,12,"American Pale Ale (APA)",542,"Arcadia Brewing Company","Battle Creek","MI","Sky High Rye (Arcadia Brewing Company)" +"133",133,0.062,17,390,"Whitsun","American Pale Wheat Ale",541,12,"American Pale Wheat Ale",542,"Arcadia Brewing Company","Battle Creek","MI","Whitsun (Arcadia Brewing Company)" +"134",134,0.052,NA,735,"On-On Ale (2008)","American Pale Ale (APA)",513,12,"American Pale Ale (APA)",514,"Arctic Craft Brewery","Colorado Springs","CO","On-On Ale (2008) (Arctic Craft Brewery)" +"135",135,0.092,50,1333,"Quakertown Stout","American Double / Imperial Stout",426,12,NA,427,"Armadillo Ale Works","Denton","TX","Quakertown Stout (Armadillo Ale Works)" +"136",136,0.051,20,1332,"Greenbelt Farmhouse Ale","Saison / Farmhouse Ale",426,12,NA,427,"Armadillo Ale Works","Denton","TX","Greenbelt Farmhouse Ale (Armadillo Ale Works)" +"137",137,0.052,10,1172,"Mo's Gose","Gose",461,16,NA,462,"Armstrong Brewing Company","South San Francisco","CA","Mo's Gose (Armstrong Brewing Company)" +"138",138,0.07,45,1322,"Green Bullet Organic India Pale Ale","American IPA",429,16,"American IPA",430,"Asher Brewing Company","Boulder","CO","Green Bullet Organic India Pale Ale (Asher Brewing Company)" +"139",139,0.032,27,550,"Rocket Girl","Kölsch",528,12,NA,529,"Asheville Brewing Company","Asheville","NC","Rocket Girl (Asheville Brewing Company)" +"140",140,0.053,26,429,"Ninja Porter","American Porter",528,12,NA,529,"Asheville Brewing Company","Asheville","NC","Ninja Porter (Asheville Brewing Company)" +"141",141,0.06,69,428,"Shiva IPA","American IPA",528,12,"American IPA",529,"Asheville Brewing Company","Asheville","NC","Shiva IPA (Asheville Brewing Company)" +"142",142,0.048,NA,1640,"Aslan Kölsch","Kölsch",353,16,NA,354,"Aslan Brewing Company","Bellingham","WA","Aslan Kölsch (Aslan Brewing Company)" +"143",143,0.077,NA,1639,"Aslan IPA","American IPA",353,16,"American IPA",354,"Aslan Brewing Company","Bellingham","WA","Aslan IPA (Aslan Brewing Company)" +"144",144,0.077,NA,1638,"Aslan Amber","American Amber / Red Ale",353,16,"American Amber / Red Ale",354,"Aslan Brewing Company","Bellingham","WA","Aslan Amber (Aslan Brewing Company)" +"145",145,0.0559999999999999,27,597,"This Season's Blonde","American Blonde Ale",523,12,"American Blonde Ale",524,"Aspen Brewing Company","Aspen","CO","This Season's Blonde (Aspen Brewing Company)" +"146",146,0.07,67,596,"Independence Pass Ale","American IPA",523,12,"American IPA",524,"Aspen Brewing Company","Aspen","CO","Independence Pass Ale (Aspen Brewing Company)" +"147",147,0.057,40,1580,"Trolley Stop Stout","American Stout",374,12,NA,375,"Astoria Brewing Company","Astoria","OR","Trolley Stop Stout (Astoria Brewing Company)" +"148",148,0.0819999999999999,138,980,"Bitter Bitch Imperial IPA","American Double / Imperial IPA",374,12,"American Double / Imperial IPA",375,"Astoria Brewing Company","Astoria","OR","Bitter Bitch Imperial IPA (Astoria Brewing Company)" +"149",149,0.062,35,979,"Poop Deck Porter","American Porter",374,12,NA,375,"Astoria Brewing Company","Astoria","OR","Poop Deck Porter (Astoria Brewing Company)" +"150",150,0.06,35,978,"Old Red Beard Amber Ale","American Amber / Red Ale",374,12,"American Amber / Red Ale",375,"Astoria Brewing Company","Astoria","OR","Old Red Beard Amber Ale (Astoria Brewing Company)" +"151",151,0.075,115,2503,"Hop A-Peel","American Double / Imperial IPA",72,16,"American Double / Imperial IPA",73,"Atwater Brewery","Detroit","MI","Hop A-Peel (Atwater Brewery)" +"152",152,0.055,12,2502,"Vanilla Java Porter","American Porter",72,16,NA,73,"Atwater Brewery","Detroit","MI","Vanilla Java Porter (Atwater Brewery)" +"153",153,0.052,NA,2495,"Michelada","Fruit / Vegetable Beer",72,16,NA,73,"Atwater Brewery","Detroit","MI","Michelada (Atwater Brewery)" +"154",154,0.045,8,534,"Dirty Blonde Ale","American Blonde Ale",72,12,"American Blonde Ale",73,"Atwater Brewery","Detroit","MI","Dirty Blonde Ale (Atwater Brewery)" +"155",155,0.05,62,528,"Grand Circus IPA","American IPA",72,12,"American IPA",73,"Atwater Brewery","Detroit","MI","Grand Circus IPA (Atwater Brewery)" +"156",156,0.05,12,527,"Atwater's Lager","Munich Helles Lager",72,12,NA,73,"Atwater Brewery","Detroit","MI","Atwater's Lager (Atwater Brewery)" +"157",157,0.07,NA,1409,"Heavy Machinery IPA Series #1: Heavy Fist","American Black Ale",413,16,NA,414,"Austin Beerworks","Austin","TX","Heavy Machinery IPA Series #1: Heavy Fist (Austin Beerworks)" +"158",158,0.062,NA,343,"Fire Eagle IPA","American IPA",413,12,"American IPA",414,"Austin Beerworks","Austin","TX","Fire Eagle IPA (Austin Beerworks)" +"159",159,0.051,NA,342,"Peacemaker","American Pale Ale (APA)",413,12,"American Pale Ale (APA)",414,"Austin Beerworks","Austin","TX","Peacemaker (Austin Beerworks)" +"160",160,0.053,NA,341,"Pearl-Snap","German Pilsener",413,12,NA,414,"Austin Beerworks","Austin","TX","Pearl-Snap (Austin Beerworks)" +"161",161,0.052,NA,340,"Black Thunder","Schwarzbier",413,12,NA,414,"Austin Beerworks","Austin","TX","Black Thunder (Austin Beerworks)" +"162",162,0.08,NA,2589,"Raja","American Double / Imperial IPA",37,12,"American Double / Imperial IPA",38,"Avery Brewing Company","Boulder","CO","Raja (Avery Brewing Company)" +"163",163,0.064,NA,2546,"Perzik Saison","Saison / Farmhouse Ale",37,12,NA,38,"Avery Brewing Company","Boulder","CO","Perzik Saison (Avery Brewing Company)" +"164",164,0.047,42,146,"Avery Joe’s Premium American Pilsner","German Pilsener",37,12,NA,38,"Avery Brewing Company","Boulder","CO","Avery Joe’s Premium American Pilsner (Avery Brewing Company)" +"165",165,0.0559999999999999,10,108,"White Rascal","Witbier",37,12,NA,38,"Avery Brewing Company","Boulder","CO","White Rascal (Avery Brewing Company)" +"166",166,0.063,69,107,"Avery India Pale Ale","American IPA",37,12,"American IPA",38,"Avery Brewing Company","Boulder","CO","Avery India Pale Ale (Avery Brewing Company)" +"167",167,0.055,17,106,"Ellie’s Brown Ale","American Brown Ale",37,12,NA,38,"Avery Brewing Company","Boulder","CO","Ellie’s Brown Ale (Avery Brewing Company)" +"168",168,0.062,17,1620,"Pumpkin Beast","Pumpkin Ale",360,12,NA,361,"Aviator Brewing Company","Fuquay-Varina","NC","Pumpkin Beast (Aviator Brewing Company)" +"169",169,0.072,22,1579,"OktoberBeast","Märzen / Oktoberfest",360,12,NA,361,"Aviator Brewing Company","Fuquay-Varina","NC","OktoberBeast (Aviator Brewing Company)" +"170",170,0.048,23,1228,"Mad Beach","American Pale Wheat Ale",360,12,"American Pale Wheat Ale",361,"Aviator Brewing Company","Fuquay-Varina","NC","Mad Beach (Aviator Brewing Company)" +"171",171,0.067,NA,705,"Hog Wild India Pale Ale","American IPA",360,12,"American IPA",361,"Aviator Brewing Company","Fuquay-Varina","NC","Hog Wild India Pale Ale (Aviator Brewing Company)" +"172",172,0.092,5,704,"Devils Tramping Ground Tripel","Tripel",360,12,NA,361,"Aviator Brewing Company","Fuquay-Varina","NC","Devils Tramping Ground Tripel (Aviator Brewing Company)" +"173",173,0.061,41,702,"Hot Rod Red","American Amber / Red Ale",360,12,"American Amber / Red Ale",361,"Aviator Brewing Company","Fuquay-Varina","NC","Hot Rod Red (Aviator Brewing Company)" +"174",174,0.086,NA,2058,"Palate Mallet","American Double / Imperial IPA",235,12,"American Double / Imperial IPA",236,"Back East Brewing Company","Bloomfield","CT","Palate Mallet (Back East Brewing Company)" +"175",175,0.06,NA,1483,"Back East Porter","American Porter",235,12,NA,236,"Back East Brewing Company","Bloomfield","CT","Back East Porter (Back East Brewing Company)" +"176",176,0.049,NA,1426,"Back East Golden Ale","American Blonde Ale",235,12,"American Blonde Ale",236,"Back East Brewing Company","Bloomfield","CT","Back East Golden Ale (Back East Brewing Company)" +"177",177,0.07,NA,1132,"Misty Mountain IPA","American IPA",235,12,"American IPA",236,"Back East Brewing Company","Bloomfield","CT","Misty Mountain IPA (Back East Brewing Company)" +"178",178,0.05,NA,1131,"Back East Ale","American Amber / Red Ale",235,12,"American Amber / Red Ale",236,"Back East Brewing Company","Bloomfield","CT","Back East Ale (Back East Brewing Company)" +"179",179,0.06,NA,1876,"Truck Stop Honey Brown Ale","English Brown Ale",286,12,NA,287,"Back Forty Beer Company","Gadsden","AL","Truck Stop Honey Brown Ale (Back Forty Beer Company)" +"180",180,0.06,43,1875,"Naked Pig Pale Ale","American Pale Ale (APA)",286,12,"American Pale Ale (APA)",287,"Back Forty Beer Company","Gadsden","AL","Naked Pig Pale Ale (Back Forty Beer Company)" +"181",181,0.068,70,966,"Topcutter India Pale Ale","American IPA",483,12,"American IPA",484,"Bale Breaker Brewing Company","Yakima","WA","Topcutter India Pale Ale (Bale Breaker Brewing Company)" +"182",182,0.044,38,965,"Field 41 Pale Ale","American Pale Ale (APA)",483,12,"American Pale Ale (APA)",484,"Bale Breaker Brewing Company","Yakima","WA","Field 41 Pale Ale (Bale Breaker Brewing Company)" +"183",183,0.07,NA,2593,"Grapefruit Sculpin","American IPA",34,12,"American IPA",35,"Ballast Point Brewing Company","San Diego","CA","Grapefruit Sculpin (Ballast Point Brewing Company)" +"184",184,0.038,40,2105,"Even Keel","American IPA",34,12,"American IPA",35,"Ballast Point Brewing Company","San Diego","CA","Even Keel (Ballast Point Brewing Company)" +"185",185,0.052,23,1401,"Ballast Point Pale Ale","Kölsch",34,12,NA,35,"Ballast Point Brewing Company","San Diego","CA","Ballast Point Pale Ale (Ballast Point Brewing Company)" +"186",186,0.07,75,1400,"Big Eye India Pale Ale","American IPA",34,12,"American IPA",35,"Ballast Point Brewing Company","San Diego","CA","Big Eye India Pale Ale (Ballast Point Brewing Company)" +"187",187,0.046,NA,1019,"Longfin Lager","Munich Helles Lager",34,12,NA,35,"Ballast Point Brewing Company","San Diego","CA","Longfin Lager (Ballast Point Brewing Company)" +"188",188,0.07,70,1018,"Sculpin IPA","American IPA",34,12,"American IPA",35,"Ballast Point Brewing Company","San Diego","CA","Sculpin IPA (Ballast Point Brewing Company)" +"189",189,0.045,NA,1776,"All Nighter Ale","Extra Special / Strong Bitter (ESB)",318,12,NA,319,"Banner Beer Company","Williamsburg","MA","All Nighter Ale (Banner Beer Company)" +"190",190,0.045,20,1644,"Banner American Rye","Rye Beer",318,12,NA,319,"Banner Beer Company","Williamsburg","MA","Banner American Rye (Banner Beer Company)" +"191",191,0.035,45,1643,"Banner American Ale","American Amber / Red Ale",318,12,"American Amber / Red Ale",319,"Banner Beer Company","Williamsburg","MA","Banner American Ale (Banner Beer Company)" +"192",192,0.07,46,2618,"Thai.p.a","American IPA",20,16,"American IPA",21,"Bare Hands Brewery","Granger","IN","Thai.p.a (Bare Hands Brewery)" +"193",193,0.06,60,2005,"Barrio Blanco","American IPA",251,12,"American IPA",252,"Barrio Brewing Company","Tucson","AZ","Barrio Blanco (Barrio Brewing Company)" +"194",194,0.045,NA,1343,"Barrio Tucson Blonde","American Blonde Ale",251,12,"American Blonde Ale",252,"Barrio Brewing Company","Tucson","AZ","Barrio Tucson Blonde (Barrio Brewing Company)" +"195",195,0.049,22,2404,"Hop in the ‘Pool Helles","American Pilsner",116,12,NA,117,"Base Camp Brewing Co.","Portland","OR","Hop in the ‘Pool Helles (Base Camp Brewing Co.)" +"196",196,0.067,60,2323,"Ultra Gnar Gnar IPA","American IPA",116,12,"American IPA",117,"Base Camp Brewing Co.","Portland","OR","Ultra Gnar Gnar IPA (Base Camp Brewing Co.)" +"197",197,0.068,62,2189,"In-Tents India Pale Lager","American Pale Lager",116,12,NA,117,"Base Camp Brewing Co.","Portland","OR","In-Tents India Pale Lager (Base Camp Brewing Co.)" +"198",198,0.05,20,2188,"Lost Meridian Wit","Witbier",116,12,NA,117,"Base Camp Brewing Co.","Portland","OR","Lost Meridian Wit (Base Camp Brewing Co.)" +"199",199,0.051,45,2187,"Celestial Meridian Cascadian Dark Lager","Euro Dark Lager",116,12,NA,117,"Base Camp Brewing Co.","Portland","OR","Celestial Meridian Cascadian Dark Lager (Base Camp Brewing Co.)" +"200",200,0.054,55,1966,"Wagon Party","California Common / Steam Beer",258,12,NA,259,"Bauhaus Brew Labs","Minneapolis","MN","Wagon Party (Bauhaus Brew Labs)" +"201",201,0.067,70,1965,"Sky-Five","American IPA",258,12,"American IPA",259,"Bauhaus Brew Labs","Minneapolis","MN","Sky-Five (Bauhaus Brew Labs)" +"202",202,0.05,28,1964,"Stargrazer","Schwarzbier",258,12,NA,259,"Bauhaus Brew Labs","Minneapolis","MN","Stargrazer (Bauhaus Brew Labs)" +"203",203,0.054,48,1963,"Wonderstuff","German Pilsener",258,12,NA,259,"Bauhaus Brew Labs","Minneapolis","MN","Wonderstuff (Bauhaus Brew Labs)" +"204",204,0.053,NA,1855,"Tarnation California-Style Lager","California Common / Steam Beer",292,12,NA,293,"Baxter Brewing Company","Lewiston","ME","Tarnation California-Style Lager (Baxter Brewing Company)" +"205",205,0.07,42,1778,"On the Count of 3 (2015)","Hefeweizen",292,16,NA,293,"Baxter Brewing Company","Lewiston","ME","On the Count of 3 (2015) (Baxter Brewing Company)" +"206",206,0.047,NA,1209,"Summer Swelter","American Pale Wheat Ale",292,12,"American Pale Wheat Ale",293,"Baxter Brewing Company","Lewiston","ME","Summer Swelter (Baxter Brewing Company)" +"207",207,0.068,NA,954,"Phantom Punch Winter Stout","Foreign / Export Stout",292,12,NA,293,"Baxter Brewing Company","Lewiston","ME","Phantom Punch Winter Stout (Baxter Brewing Company)" +"208",208,0.066,NA,910,"Hayride Autumn Ale","Rye Beer",292,12,NA,293,"Baxter Brewing Company","Lewiston","ME","Hayride Autumn Ale (Baxter Brewing Company)" +"209",209,0.047,NA,707,"Celsius Summer Ale (2012)","American Pale Wheat Ale",292,12,"American Pale Wheat Ale",293,"Baxter Brewing Company","Lewiston","ME","Celsius Summer Ale (2012) (Baxter Brewing Company)" +"210",210,0.055,35,533,"Amber Road","American Amber / Red Ale",292,12,"American Amber / Red Ale",293,"Baxter Brewing Company","Lewiston","ME","Amber Road (Baxter Brewing Company)" +"211",211,0.049,28,183,"Pamola Xtra Pale Ale","American Pale Ale (APA)",292,12,"American Pale Ale (APA)",293,"Baxter Brewing Company","Lewiston","ME","Pamola Xtra Pale Ale (Baxter Brewing Company)" +"212",212,0.069,69,182,"Stowaway IPA","American IPA",292,12,"American IPA",293,"Baxter Brewing Company","Lewiston","ME","Stowaway IPA (Baxter Brewing Company)" +"213",213,0.088,108,1806,"Hoptopus Double IPA","American Double / Imperial IPA",306,16,"American Double / Imperial IPA",307,"Beach Brewing Company","Virginia Beach","VA","Hoptopus Double IPA (Beach Brewing Company)" +"214",214,0.05,10,2435,"Watermelon Ale","Fruit / Vegetable Beer",103,12,NA,104,"Beer Works Brewery","Lowell","MA","Watermelon Ale (Beer Works Brewery)" +"215",215,0.0579999999999999,45,2423,"Fenway American Pale Ale","American Pale Ale (APA)",103,12,"American Pale Ale (APA)",104,"Beer Works Brewery","Lowell","MA","Fenway American Pale Ale (Beer Works Brewery)" +"216",216,0.068,85,2420,"Back Bay IPA","American IPA",103,12,"American IPA",104,"Beer Works Brewery","Lowell","MA","Back Bay IPA (Beer Works Brewery)" +"217",217,0.048,16,2419,"Bunker Hill Blueberry Ale","Other",103,12,NA,104,"Beer Works Brewery","Lowell","MA","Bunker Hill Blueberry Ale (Beer Works Brewery)" +"218",218,0.0579999999999999,NA,2494,"Oberon","American Pale Wheat Ale",76,12,"American Pale Wheat Ale",77,"Bell's Brewery","Kalamazoo","MI","Oberon (Bell's Brewery)" +"219",219,0.06,NA,2325,"Smitten","Rye Beer",76,16,NA,77,"Bell's Brewery","Kalamazoo","MI","Smitten (Bell's Brewery)" +"220",220,0.05,NA,2022,"Winter White","Witbier",76,16,NA,77,"Bell's Brewery","Kalamazoo","MI","Winter White (Bell's Brewery)" +"221",221,0.0579999999999999,NA,1989,"Oberon","American Pale Wheat Ale",76,16,"American Pale Wheat Ale",77,"Bell's Brewery","Kalamazoo","MI","Oberon (Bell's Brewery)" +"222",222,0.07,NA,1988,"Two Hearted","American IPA",76,16,"American IPA",77,"Bell's Brewery","Kalamazoo","MI","Two Hearted (Bell's Brewery)" +"223",223,0.0579999999999999,NA,1955,"Best Brown","American Brown Ale",76,16,NA,77,"Bell's Brewery","Kalamazoo","MI","Best Brown (Bell's Brewery)" +"224",224,0.044,44,2558,"Moar","English India Pale Ale (IPA)",53,12,NA,54,"Bent Brewstillery","Roseville","MN","Moar (Bent Brewstillery)" +"225",225,0.083,NA,2557,"Uber Lupin Schwarz IPA","American Double / Imperial IPA",53,16,"American Double / Imperial IPA",54,"Bent Brewstillery","Roseville","MN","Uber Lupin Schwarz IPA (Bent Brewstillery)" +"226",226,0.057,27,2556,"Nordic Blonde","American Blonde Ale",53,12,"American Blonde Ale",54,"Bent Brewstillery","Roseville","MN","Nordic Blonde (Bent Brewstillery)" +"227",227,0.06,NA,2496,"Cold Press","American Black Ale",75,12,NA,76,"Bent Paddle Brewing Company","Duluth","MN","Cold Press (Bent Paddle Brewing Company)" +"228",228,0.072,87,2410,"Harness the Winter","American IPA",75,12,"American IPA",76,"Bent Paddle Brewing Company","Duluth","MN","Harness the Winter (Bent Paddle Brewing Company)" +"229",229,0.0559999999999999,32,1902,"14° ESB","Extra Special / Strong Bitter (ESB)",75,12,NA,76,"Bent Paddle Brewing Company","Duluth","MN","14° ESB (Bent Paddle Brewing Company)" +"230",230,0.062,68,1901,"Bent Hop Golden IPA","American IPA",75,12,"American IPA",76,"Bent Paddle Brewing Company","Duluth","MN","Bent Hop Golden IPA (Bent Paddle Brewing Company)" +"231",231,0.06,34,1261,"Bent Paddle Black Ale","American Black Ale",75,12,NA,76,"Bent Paddle Brewing Company","Duluth","MN","Bent Paddle Black Ale (Bent Paddle Brewing Company)" +"232",232,0.05,38,1253,"Venture Pils","German Pilsener",75,12,NA,76,"Bent Paddle Brewing Company","Duluth","MN","Venture Pils (Bent Paddle Brewing Company)" +"233",233,0.055,40,1900,"Lost Sailor IPA","English India Pale Ale (IPA)",278,12,NA,279,"Berkshire Brewing Company","South Deerfield","MA","Lost Sailor IPA (Berkshire Brewing Company)" +"234",234,0.053,20,1317,"Steel Rail Extra Pale Ale","American Pale Ale (APA)",278,12,"American Pale Ale (APA)",279,"Berkshire Brewing Company","South Deerfield","MA","Steel Rail Extra Pale Ale (Berkshire Brewing Company)" +"235",235,0.078,NA,1158,"La Frontera Premium IPA","American IPA",463,12,"American IPA",464,"Big Bend Brewing Company","Alpine","TX","La Frontera Premium IPA (Big Bend Brewing Company)" +"236",236,0.047,NA,1157,"Tejas Lager","Czech Pilsener",463,12,NA,464,"Big Bend Brewing Company","Alpine","TX","Tejas Lager (Big Bend Brewing Company)" +"237",237,0.064,NA,1156,"Number 22 Porter","American Porter",463,12,NA,464,"Big Bend Brewing Company","Alpine","TX","Number 22 Porter (Big Bend Brewing Company)" +"238",238,0.0559999999999999,NA,1155,"Big Bend Hefeweizen","Hefeweizen",463,12,NA,464,"Big Bend Brewing Company","Alpine","TX","Big Bend Hefeweizen (Big Bend Brewing Company)" +"239",239,0.06,NA,1154,"Terlingua Gold","American Blonde Ale",463,12,"American Blonde Ale",464,"Big Bend Brewing Company","Alpine","TX","Terlingua Gold (Big Bend Brewing Company)" +"240",240,0.081,17,2104,"Aprè Shred","American Strong Ale",220,16,NA,221,"Big Choice Brewing","Broomfield","CO","Aprè Shred (Big Choice Brewing)" +"241",241,0.095,104,1762,"Hemlock Double IPA","American Double / Imperial IPA",220,12,"American Double / Imperial IPA",221,"Big Choice Brewing","Broomfield","CO","Hemlock Double IPA (Big Choice Brewing)" +"242",242,0.0409999999999999,NA,1422,"West Portal Colorado Common Summer Ale","California Common / Steam Beer",220,16,NA,221,"Big Choice Brewing","Broomfield","CO","West Portal Colorado Common Summer Ale (Big Choice Brewing)" +"243",243,0.067,85,1067,"Disconnected Red","American Amber / Red Ale",220,16,"American Amber / Red Ale",221,"Big Choice Brewing","Broomfield","CO","Disconnected Red (Big Choice Brewing)" +"244",244,0.07,NA,1003,"Big Elm IPA","American IPA",477,12,"American IPA",478,"Big Elm Brewing","Sheffield","MA","Big Elm IPA (Big Elm Brewing)" +"245",245,0.065,NA,1002,"Gerry Dog Stout","American Stout",477,12,NA,478,"Big Elm Brewing","Sheffield","MA","Gerry Dog Stout (Big Elm Brewing)" +"246",246,0.06,NA,1001,"413 Farmhouse Ale","Saison / Farmhouse Ale",477,12,NA,478,"Big Elm Brewing","Sheffield","MA","413 Farmhouse Ale (Big Elm Brewing)" +"247",247,0.08,54,2639,"Dark Star","American Stout",8,16,NA,9,"Big Lake Brewing","Holland","MI","Dark Star (Big Lake Brewing)" +"248",248,0.062,NA,2469,"Ryecoe","American IPA",8,16,"American IPA",9,"Big Lake Brewing","Holland","MI","Ryecoe (Big Lake Brewing)" +"249",249,0.06,NA,2586,"Blueberry Blonde","Fruit / Vegetable Beer",40,12,NA,41,"Big Muddy Brewing","Murphysboro","IL","Blueberry Blonde (Big Muddy Brewing)" +"250",250,0.075,60,2585,"Galaxy IPA","American IPA",40,16,"American IPA",41,"Big Muddy Brewing","Murphysboro","IL","Galaxy IPA (Big Muddy Brewing)" +"251",251,0.05,32,643,"Big River Pilsner","Czech Pilsener",519,12,NA,520,"Big River Brewing Company","Chattanooga","TN","Big River Pilsner (Big River Brewing Company)" +"252",252,0.06,55,632,"House Brand IPA","American IPA",519,12,"American IPA",520,"Big River Brewing Company","Chattanooga","TN","House Brand IPA (Big River Brewing Company)" +"253",253,0.062,65,1714,"Big Sky IPA","American IPA",336,12,"American IPA",337,"Big Sky Brewing Company","Missoula","MT","Big Sky IPA (Big Sky Brewing Company)" +"254",254,0.05,40,1713,"Scape Goat Pale Ale","English Pale Ale",336,12,NA,337,"Big Sky Brewing Company","Missoula","MT","Scape Goat Pale Ale (Big Sky Brewing Company)" +"255",255,0.05,35,1712,"Montana Trout Slayer Ale","American Pale Wheat Ale",336,12,"American Pale Wheat Ale",337,"Big Sky Brewing Company","Missoula","MT","Montana Trout Slayer Ale (Big Sky Brewing Company)" +"256",256,0.051,26,1711,"Moose Drool Brown Ale","American Brown Ale",336,12,NA,337,"Big Sky Brewing Company","Missoula","MT","Moose Drool Brown Ale (Big Sky Brewing Company)" +"257",257,0.072,60,1456,"Powder Hound Winter Ale","English Strong Ale",336,12,NA,337,"Big Sky Brewing Company","Missoula","MT","Powder Hound Winter Ale (Big Sky Brewing Company)" +"258",258,0.051,26,767,"Moose Drool Brown Ale (2011)","American Brown Ale",336,12,NA,337,"Big Sky Brewing Company","Missoula","MT","Moose Drool Brown Ale (2011) (Big Sky Brewing Company)" +"259",259,0.05,35,766,"Montana Trout Slayer Ale (2012)","American Pale Wheat Ale",336,12,"American Pale Wheat Ale",337,"Big Sky Brewing Company","Missoula","MT","Montana Trout Slayer Ale (2012) (Big Sky Brewing Company)" +"260",260,0.062,65,579,"Big Sky IPA (2012)","American IPA",336,12,"American IPA",337,"Big Sky Brewing Company","Missoula","MT","Big Sky IPA (2012) (Big Sky Brewing Company)" +"261",261,0.047,NA,168,"Summer Honey","American Blonde Ale",336,12,"American Blonde Ale",337,"Big Sky Brewing Company","Missoula","MT","Summer Honey (Big Sky Brewing Company)" +"262",262,0.05,40,159,"Scape Goat Pale Ale (2010)","English Pale Ale",336,12,NA,337,"Big Sky Brewing Company","Missoula","MT","Scape Goat Pale Ale (2010) (Big Sky Brewing Company)" +"263",263,0.05,35,35,"Montana Trout Slayer Ale (2009)","American Pale Wheat Ale",336,12,"American Pale Wheat Ale",337,"Big Sky Brewing Company","Missoula","MT","Montana Trout Slayer Ale (2009) (Big Sky Brewing Company)" +"264",264,0.051,26,34,"Moose Drool Brown Ale (2009)","American Brown Ale",336,12,NA,337,"Big Sky Brewing Company","Missoula","MT","Moose Drool Brown Ale (2009) (Big Sky Brewing Company)" +"265",265,0.069,81,2096,"Arcus IPA","American IPA",221,12,"American IPA",222,"Big Storm Brewing Company","Odessa","FL","Arcus IPA (Big Storm Brewing Company)" +"266",266,0.0579999999999999,38,2095,"Wavemaker","American Amber / Red Ale",221,12,"American Amber / Red Ale",222,"Big Storm Brewing Company","Odessa","FL","Wavemaker (Big Storm Brewing Company)" +"267",267,0.053,43,1257,"Jack Pine Savage","American Pale Ale (APA)",444,16,"American Pale Ale (APA)",445,"Big Wood Brewery","Vadnais Heights","MN","Jack Pine Savage (Big Wood Brewery)" +"268",268,0.099,85,1256,"Forest Fire Imperial Smoked Rye","Rye Beer",444,16,NA,445,"Big Wood Brewery","Vadnais Heights","MN","Forest Fire Imperial Smoked Rye (Big Wood Brewery)" +"269",269,0.098,76,1255,"Bad Axe Imperial IPA","American Double / Imperial IPA",444,16,"American Double / Imperial IPA",445,"Big Wood Brewery","Vadnais Heights","MN","Bad Axe Imperial IPA (Big Wood Brewery)" +"270",270,0.055,35,986,"Morning Wood","Oatmeal Stout",444,16,NA,445,"Big Wood Brewery","Vadnais Heights","MN","Morning Wood (Big Wood Brewery)" +"271",271,0.066,50,985,"Bark Bite IPA","American IPA",444,16,"American IPA",445,"Big Wood Brewery","Vadnais Heights","MN","Bark Bite IPA (Big Wood Brewery)" +"272",272,0.055,45,2508,"Jalapeno Pale Ale","American Pale Ale (APA)",70,16,"American Pale Ale (APA)",71,"Birdsong Brewing Company","Charlotte","NC","Jalapeno Pale Ale (Birdsong Brewing Company)" +"273",273,0.052,NA,1441,"Blown Out Brown","American Brown Ale",407,12,NA,408,"Bitter Root Brewing","Hamilton","MT","Blown Out Brown (Bitter Root Brewing)" +"274",274,0.063,NA,1413,"Single Hop Ale","American Pale Ale (APA)",407,12,"American Pale Ale (APA)",408,"Bitter Root Brewing","Hamilton","MT","Single Hop Ale (Bitter Root Brewing)" +"275",275,0.054,NA,1411,"Sawtooth Ale","American Blonde Ale",407,12,"American Blonde Ale",408,"Bitter Root Brewing","Hamilton","MT","Sawtooth Ale (Bitter Root Brewing)" +"276",276,0.072,75,2620,"Saucy Intruder","Rye Beer",18,16,NA,19,"Black Acre Brewing Co.","Indianapolis","IN","Saucy Intruder (Black Acre Brewing Co.)" +"277",277,0.045,16,2412,"Deception","American Blonde Ale",112,12,"American Blonde Ale",113,"Black Market Brewing Company","Temecula","CA","Deception (Black Market Brewing Company)" +"278",278,0.075,35,1898,"Blackmarket Rye IPA","American IPA",112,12,"American IPA",113,"Black Market Brewing Company","Temecula","CA","Blackmarket Rye IPA (Black Market Brewing Company)" +"279",279,0.05,8,1897,"Black Market Hefeweizen","Hefeweizen",112,12,NA,113,"Black Market Brewing Company","Temecula","CA","Black Market Hefeweizen (Black Market Brewing Company)" +"280",280,0.0579999999999999,44,1896,"Aftermath Pale Ale","American Pale Ale (APA)",112,12,"American Pale Ale (APA)",113,"Black Market Brewing Company","Temecula","CA","Aftermath Pale Ale (Black Market Brewing Company)" +"281",281,0.071,83,1850,"American India Red Ale","American Strong Ale",294,12,NA,295,"Black Shirt Brewing Company","Denver","CO","American India Red Ale (Black Shirt Brewing Company)" +"282",282,0.071,45,1849,"American Red Porter","American Porter",294,12,NA,295,"Black Shirt Brewing Company","Denver","CO","American Red Porter (Black Shirt Brewing Company)" +"283",283,0.078,34,1848,"American Red Saison","Saison / Farmhouse Ale",294,12,NA,295,"Black Shirt Brewing Company","Denver","CO","American Red Saison (Black Shirt Brewing Company)" +"284",284,0.066,44,1847,"Colorado Red Ale","American Amber / Red Ale",294,12,"American Amber / Red Ale",295,"Black Shirt Brewing Company","Denver","CO","Colorado Red Ale (Black Shirt Brewing Company)" +"285",285,0.048,16,2485,"Saddle Bronc Brown Ale","American Brown Ale",79,12,NA,80,"Black Tooth Brewing Company","Sheridan","WY","Saddle Bronc Brown Ale (Black Tooth Brewing Company)" +"286",286,0.046,20,2484,"Bomber Mountain Amber Ale","American Amber / Red Ale",79,12,"American Amber / Red Ale",80,"Black Tooth Brewing Company","Sheridan","WY","Bomber Mountain Amber Ale (Black Tooth Brewing Company)" +"287",287,0.073,NA,2449,"Flying Sailor","Rye Beer",95,12,NA,96,"Blackrocks Brewery","Marquette","MA","Flying Sailor (Blackrocks Brewery)" +"288",288,0.048,47,2634,"Nordskye","American IPA",12,12,"American IPA",13,"Blackrocks Brewery","Marquette","MI","Nordskye (Blackrocks Brewery)" +"289",289,0.06,30,2153,"North Third Stout","Foreign / Export Stout",12,12,NA,13,"Blackrocks Brewery","Marquette","MI","North Third Stout (Blackrocks Brewery)" +"290",290,0.052,NA,1953,"Honey Lav","American Pale Wheat Ale",12,12,"American Pale Wheat Ale",13,"Blackrocks Brewery","Marquette","MI","Honey Lav (Blackrocks Brewery)" +"291",291,0.068,NA,1496,"Coconut Brown Ale","American Brown Ale",12,12,NA,13,"Blackrocks Brewery","Marquette","MI","Coconut Brown Ale (Blackrocks Brewery)" +"292",292,0.07,51,1481,"51K IPA","American IPA",12,12,"American IPA",13,"Blackrocks Brewery","Marquette","MI","51K IPA (Blackrocks Brewery)" +"293",293,0.055,NA,1480,"Grand Rabbits","Cream Ale",12,12,NA,13,"Blackrocks Brewery","Marquette","MI","Grand Rabbits (Blackrocks Brewery)" +"294",294,0.05,NA,1564,"1800 Big Log Wheat (2012)","American Pale Wheat Ale",380,12,"American Pale Wheat Ale",381,"Blue Blood Brewing Company","Lincoln","NE","1800 Big Log Wheat (2012) (Blue Blood Brewing Company)" +"295",295,NA,NA,1541,"Double Play Pilsner","American Pilsner",380,12,NA,381,"Blue Blood Brewing Company","Lincoln","NE","Double Play Pilsner (Blue Blood Brewing Company)" +"296",296,0.055,NA,1321,"Brewerhood Brown Ale","American Brown Ale",380,12,NA,381,"Blue Blood Brewing Company","Lincoln","NE","Brewerhood Brown Ale (Blue Blood Brewing Company)" +"297",297,0.08,NA,1320,"Last Call Imperial Amber Ale","American Amber / Red Ale",380,12,"American Amber / Red Ale",381,"Blue Blood Brewing Company","Lincoln","NE","Last Call Imperial Amber Ale (Blue Blood Brewing Company)" +"298",298,0.096,NA,1319,"Pernicious Double IPA","American Double / Imperial IPA",380,12,"American Double / Imperial IPA",381,"Blue Blood Brewing Company","Lincoln","NE","Pernicious Double IPA (Blue Blood Brewing Company)" +"299",299,0.052,NA,1303,"6-4-3 Double Play Pilsner","German Pilsener",380,12,NA,381,"Blue Blood Brewing Company","Lincoln","NE","6-4-3 Double Play Pilsner (Blue Blood Brewing Company)" +"300",300,NA,NA,1025,"N Street Drive-In 50th Anniversary IPA","American Double / Imperial IPA",380,12,"American Double / Imperial IPA",381,"Blue Blood Brewing Company","Lincoln","NE","N Street Drive-In 50th Anniversary IPA (Blue Blood Brewing Company)" +"301",301,0.05,NA,1012,"467 Ethan's Stout","American Stout",380,12,NA,381,"Blue Blood Brewing Company","Lincoln","NE","467 Ethan's Stout (Blue Blood Brewing Company)" +"302",302,0.064,NA,942,"1335 Wicked Snout","Saison / Farmhouse Ale",380,12,NA,381,"Blue Blood Brewing Company","Lincoln","NE","1335 Wicked Snout (Blue Blood Brewing Company)" +"303",303,0.045,NA,937,"543 Skull Creek Fresh Hopped Pale Ale","American Pale Ale (APA)",380,12,"American Pale Ale (APA)",381,"Blue Blood Brewing Company","Lincoln","NE","543 Skull Creek Fresh Hopped Pale Ale (Blue Blood Brewing Company)" +"304",304,0.0559999999999999,37,888,"1327 Pod's ESB","Extra Special / Strong Bitter (ESB)",380,12,NA,381,"Blue Blood Brewing Company","Lincoln","NE","1327 Pod's ESB (Blue Blood Brewing Company)" +"305",305,0.0559999999999999,37,886,"1327 Pod's ESB","Extra Special / Strong Bitter (ESB)",380,12,NA,381,"Blue Blood Brewing Company","Lincoln","NE","1327 Pod's ESB (Blue Blood Brewing Company)" +"306",306,0.0559999999999999,37,612,"1327 Pod's ESB","Extra Special / Strong Bitter (ESB)",380,12,NA,381,"Blue Blood Brewing Company","Lincoln","NE","1327 Pod's ESB (Blue Blood Brewing Company)" +"307",307,0.046,35,611,"834 Happy As Ale","American Pale Ale (APA)",380,12,"American Pale Ale (APA)",381,"Blue Blood Brewing Company","Lincoln","NE","834 Happy As Ale (Blue Blood Brewing Company)" +"308",308,0.059,NA,1372,"Yellow Collar","Mead",422,12,NA,423,"Blue Dog Mead","Eugene","OR","Yellow Collar (Blue Dog Mead)" +"309",309,0.059,NA,1371,"Green Collar","Mead",422,12,NA,423,"Blue Dog Mead","Eugene","OR","Green Collar (Blue Dog Mead)" +"310",310,0.08,80,1812,"Quarter Mile Double IPA","American Double / Imperial IPA",304,12,"American Double / Imperial IPA",305,"Blue Hills Brewery","Canton","MA","Quarter Mile Double IPA (Blue Hills Brewery)" +"311",311,0.059,60,1547,"Full Nelson Pale Ale","American Pale Ale (APA)",382,12,"American Pale Ale (APA)",383,"Blue Mountain Brewery","Afton","VA","Full Nelson Pale Ale (Blue Mountain Brewery)" +"312",312,0.065,30,1546,"Steel Wheels ESB","Extra Special / Strong Bitter (ESB)",382,12,NA,383,"Blue Mountain Brewery","Afton","VA","Steel Wheels ESB (Blue Mountain Brewery)" +"313",313,0.053,22,1545,"Blue Mountain Classic Lager","Euro Pale Lager",382,12,NA,383,"Blue Mountain Brewery","Afton","VA","Blue Mountain Classic Lager (Blue Mountain Brewery)" +"314",314,0.059,60,119,"Full Nelson Pale Ale (2010)","American Pale Ale (APA)",382,12,"American Pale Ale (APA)",383,"Blue Mountain Brewery","Afton","VA","Full Nelson Pale Ale (2010) (Blue Mountain Brewery)" +"315",315,0.049,16,1408,"Kölsch 151","Kölsch",414,12,NA,415,"Blue Mountain Brewery","Arrington","VA","Kölsch 151 (Blue Mountain Brewery)" +"316",316,NA,NA,2490,"Professor Black","American Stout",77,12,NA,78,"Blue Owl Brewing","Austin","TX","Professor Black (Blue Owl Brewing)" +"317",317,NA,NA,2489,"Little Boss","American Pale Wheat Ale",77,12,"American Pale Wheat Ale",78,"Blue Owl Brewing","Austin","TX","Little Boss (Blue Owl Brewing)" +"318",318,NA,NA,2488,"Van Dayum!","American Amber / Red Ale",77,12,"American Amber / Red Ale",78,"Blue Owl Brewing","Austin","TX","Van Dayum! (Blue Owl Brewing)" +"319",319,NA,NA,2487,"Spirit Animal","American Pale Ale (APA)",77,12,"American Pale Ale (APA)",78,"Blue Owl Brewing","Austin","TX","Spirit Animal (Blue Owl Brewing)" +"320",320,0.07,NA,939,"Toxic Sludge","American Black Ale",489,16,NA,490,"Blue Point Brewing Company","Patchogue","NY","Toxic Sludge (Blue Point Brewing Company)" +"321",321,0.06,40,692,"Blue Point White IPA","American White IPA",489,12,NA,490,"Blue Point Brewing Company","Patchogue","NY","Blue Point White IPA (Blue Point Brewing Company)" +"322",322,0.044,16,667,"Blue Point Summer Ale","American Blonde Ale",489,12,"American Blonde Ale",490,"Blue Point Brewing Company","Patchogue","NY","Blue Point Summer Ale (Blue Point Brewing Company)" +"323",323,0.055,28,665,"Toasted Lager","Vienna Lager",489,12,NA,490,"Blue Point Brewing Company","Patchogue","NY","Toasted Lager (Blue Point Brewing Company)" +"324",324,0.06,NA,1607,"Bohemian Export Lager","Dortmunder / Export Lager",364,12,NA,365,"Bohemian Brewery","Midvale","UT","Bohemian Export Lager (Bohemian Brewery)" +"325",325,0.053,NA,1597,"Altus Bohemes Altbier","Altbier",364,12,NA,365,"Bohemian Brewery","Midvale","UT","Altus Bohemes Altbier (Bohemian Brewery)" +"326",326,0.04,NA,344,"Cherny Bock","Schwarzbier",364,12,NA,365,"Bohemian Brewery","Midvale","UT","Cherny Bock (Bohemian Brewery)" +"327",327,0.05,NA,89,"Czech Pilsner","Czech Pilsener",364,12,NA,365,"Bohemian Brewery","Midvale","UT","Czech Pilsner (Bohemian Brewery)" +"328",328,0.05,NA,88,"Viennese Lager","Vienna Lager",364,12,NA,365,"Bohemian Brewery","Midvale","UT","Viennese Lager (Bohemian Brewery)" +"329",329,0.065,NA,1569,"Mad Manatee IPA","American IPA",378,12,"American IPA",379,"Bold City Brewery","Jacksonville","FL","Mad Manatee IPA (Bold City Brewery)" +"330",330,0.055,NA,1568,"Killer Whale Cream Ale","Cream Ale",378,12,NA,379,"Bold City Brewery","Jacksonville","FL","Killer Whale Cream Ale (Bold City Brewery)" +"331",331,0.06,NA,1188,"Duke's Cold Nose Brown Ale","American Brown Ale",378,12,NA,379,"Bold City Brewery","Jacksonville","FL","Duke's Cold Nose Brown Ale (Bold City Brewery)" +"332",332,0.042,30,1891,"Longhop IPA","American IPA",281,16,"American IPA",282,"Bolero Snort Brewery","Ridgefield Park","NJ","Longhop IPA (Bolero Snort Brewery)" +"333",333,0.04,34,1890,"Lucky Buck","Irish Dry Stout",281,16,NA,282,"Bolero Snort Brewery","Ridgefield Park","NJ","Lucky Buck (Bolero Snort Brewery)" +"334",334,0.051,NA,577,"Bomb Lager (New Recipe)","Munich Helles Lager",525,12,NA,526,"Bomb Beer Company","New York","NY","Bomb Lager (New Recipe) (Bomb Beer Company)" +"335",335,0.045,27,513,"Bomb Lager (Old Recipe)","Munich Helles Lager",525,12,NA,526,"Bomb Beer Company","New York","NY","Bomb Lager (Old Recipe) (Bomb Beer Company)" +"336",336,0.066,72,2422,"Firestarter India Pale Ale","American IPA",107,12,"American IPA",108,"Bonfire Brewing Company","Eagle","CO","Firestarter India Pale Ale (Bonfire Brewing Company)" +"337",337,0.075,22,1727,"Kilt Dropper Scotch Ale","Scotch Ale / Wee Heavy",107,16,NA,108,"Bonfire Brewing Company","Eagle","CO","Kilt Dropper Scotch Ale (Bonfire Brewing Company)" +"338",338,0.048,30,1614,"Wood Splitter Pilsner","Czech Pilsener",107,16,NA,108,"Bonfire Brewing Company","Eagle","CO","Wood Splitter Pilsner (Bonfire Brewing Company)" +"339",339,0.0559999999999999,26,1613,"Gyptoberfest","Märzen / Oktoberfest",107,12,NA,108,"Bonfire Brewing Company","Eagle","CO","Gyptoberfest (Bonfire Brewing Company)" +"340",340,0.07,94,1549,"Farmer Wirtz India Pale Ale","English India Pale Ale (IPA)",107,16,NA,108,"Bonfire Brewing Company","Eagle","CO","Farmer Wirtz India Pale Ale (Bonfire Brewing Company)" +"341",341,0.047,NA,1548,"Slow & Steady Golden Ale","American Blonde Ale",107,12,"American Blonde Ale",108,"Bonfire Brewing Company","Eagle","CO","Slow & Steady Golden Ale (Bonfire Brewing Company)" +"342",342,0.068,NA,1517,"Pink-I Raspberry IPA","American IPA",107,16,"American IPA",108,"Bonfire Brewing Company","Eagle","CO","Pink-I Raspberry IPA (Bonfire Brewing Company)" +"343",343,0.047,NA,1500,"Moe's Original Bar B Que 'Bama Brew Golden Ale","American Blonde Ale",107,12,"American Blonde Ale",108,"Bonfire Brewing Company","Eagle","CO","Moe's Original Bar B Que 'Bama Brew Golden Ale (Bonfire Brewing Company)" +"344",344,0.047,NA,1421,"Live Local Golden Ale","American Blonde Ale",107,12,"American Blonde Ale",108,"Bonfire Brewing Company","Eagle","CO","Live Local Golden Ale (Bonfire Brewing Company)" +"345",345,0.048,38,1360,"Screaming Eagle Special Ale ESB","Extra Special / Strong Bitter (ESB)",107,12,NA,108,"Bonfire Brewing Company","Eagle","CO","Screaming Eagle Special Ale ESB (Bonfire Brewing Company)" +"346",346,0.049,NA,1184,"Dirtbag Dunkel","Munich Dunkel Lager",107,16,NA,108,"Bonfire Brewing Company","Eagle","CO","Dirtbag Dunkel (Bonfire Brewing Company)" +"347",347,0.053,45,1183,"Kindler Pale Ale","American Pale Ale (APA)",107,12,"American Pale Ale (APA)",108,"Bonfire Brewing Company","Eagle","CO","Kindler Pale Ale (Bonfire Brewing Company)" +"348",348,0.064,NA,1023,"Mistress Winter Wheat","Winter Warmer",107,12,NA,108,"Bonfire Brewing Company","Eagle","CO","Mistress Winter Wheat (Bonfire Brewing Company)" +"349",349,0.061,NA,998,"Tent Pole Vanilla Porter","American Porter",107,16,NA,108,"Bonfire Brewing Company","Eagle","CO","Tent Pole Vanilla Porter (Bonfire Brewing Company)" +"350",350,0.0579999999999999,NA,997,"Awry Rye Pale Ale","American Pale Ale (APA)",107,12,"American Pale Ale (APA)",108,"Bonfire Brewing Company","Eagle","CO","Awry Rye Pale Ale (Bonfire Brewing Company)" +"351",351,0.0579999999999999,NA,996,"Demshitz Brown Ale","American Brown Ale",107,12,NA,108,"Bonfire Brewing Company","Eagle","CO","Demshitz Brown Ale (Bonfire Brewing Company)" +"352",352,0.048,NA,931,"Wood Splitter Pilsner (2012)","Czech Pilsener",107,12,NA,108,"Bonfire Brewing Company","Eagle","CO","Wood Splitter Pilsner (2012) (Bonfire Brewing Company)" +"353",353,0.048,NA,798,"Brush Creek Blonde","American Blonde Ale",107,16,"American Blonde Ale",108,"Bonfire Brewing Company","Eagle","CO","Brush Creek Blonde (Bonfire Brewing Company)" +"354",354,0.066,72,633,"Firestarter India Pale Ale","American IPA",107,16,"American IPA",108,"Bonfire Brewing Company","Eagle","CO","Firestarter India Pale Ale (Bonfire Brewing Company)" +"355",355,0.071,16,2062,"Noche Dulce","American Porter",231,16,NA,232,"Borderlands Brewing Company","Tucson","AZ","Noche Dulce (Borderlands Brewing Company)" +"356",356,0.045,8,1830,"Porch Rocker","Radler",300,12,NA,301,"Boston Beer Company","Boston","MA","Porch Rocker (Boston Beer Company)" +"357",357,0.065,45,1629,"Rebel IPA","American IPA",300,16,"American IPA",301,"Boston Beer Company","Boston","MA","Rebel IPA (Boston Beer Company)" +"358",358,0.055,NA,1601,"Cold Snap","Witbier",300,12,NA,301,"Boston Beer Company","Boston","MA","Cold Snap (Boston Beer Company)" +"359",359,0.0559999999999999,NA,1427,"Samuel Adams Winter Lager","Bock",300,12,NA,301,"Boston Beer Company","Boston","MA","Samuel Adams Winter Lager (Boston Beer Company)" +"360",360,0.049,30,1349,"Boston Lager","Vienna Lager",300,16,NA,301,"Boston Beer Company","Boston","MA","Boston Lager (Boston Beer Company)" +"361",361,0.049,30,1310,"Boston Lager","Vienna Lager",300,12,NA,301,"Boston Beer Company","Boston","MA","Boston Lager (Boston Beer Company)" +"362",362,0.053,15,1281,"Samuel Adams Octoberfest","Märzen / Oktoberfest",300,12,NA,301,"Boston Beer Company","Boston","MA","Samuel Adams Octoberfest (Boston Beer Company)" +"363",363,0.053,7,1144,"Samuel Adams Summer Ale","American Pale Wheat Ale",300,12,"American Pale Wheat Ale",301,"Boston Beer Company","Boston","MA","Samuel Adams Summer Ale (Boston Beer Company)" +"364",364,0.049,30,1143,"Boston Lager","Vienna Lager",300,12,NA,301,"Boston Beer Company","Boston","MA","Boston Lager (Boston Beer Company)" +"365",365,0.049,35,1395,"Hazed & Infused","American Pale Ale (APA)",417,12,"American Pale Ale (APA)",418,"Boulder Beer Company","Boulder","CO","Hazed & Infused (Boulder Beer Company)" +"366",366,0.057,35,808,"Hoopla Pale Ale","American Pale Ale (APA)",417,12,"American Pale Ale (APA)",418,"Boulder Beer Company","Boulder","CO","Hoopla Pale Ale (Boulder Beer Company)" +"367",367,0.049,35,81,"Hazed & Infused (2010)","American Pale Ale (APA)",417,12,"American Pale Ale (APA)",418,"Boulder Beer Company","Boulder","CO","Hazed & Infused (2010) (Boulder Beer Company)" +"368",368,0.062,80,2596,"Heavy Lifting","American IPA",31,12,"American IPA",32,"Boulevard Brewing Company","Kansas City","MO","Heavy Lifting (Boulevard Brewing Company)" +"369",369,0.065,NA,2300,"1492","American Pale Ale (APA)",167,12,"American Pale Ale (APA)",168,"Boxcar Brewing Company","West Chester","PA","1492 (Boxcar Brewing Company)" +"370",370,0.0579999999999999,NA,2299,"Mango Ginger","American IPA",167,12,"American IPA",168,"Boxcar Brewing Company","West Chester","PA","Mango Ginger (Boxcar Brewing Company)" +"371",371,0.047,NA,2298,"Passenger","English Dark Mild Ale",167,12,NA,168,"Boxcar Brewing Company","West Chester","PA","Passenger (Boxcar Brewing Company)" +"372",372,0.06,52,2107,"Plum St. Porter","American Porter",219,12,NA,220,"Bozeman Brewing Company","Bozeman","MT","Plum St. Porter (Bozeman Brewing Company)" +"373",373,0.057,52,1573,"Plum St. Porter","American Porter",219,12,NA,220,"Bozeman Brewing Company","Bozeman","MT","Plum St. Porter (Bozeman Brewing Company)" +"374",374,0.07,80,1289,"Bozone HopZone IPA","American IPA",219,12,"American IPA",220,"Bozeman Brewing Company","Bozeman","MT","Bozone HopZone IPA (Bozeman Brewing Company)" +"375",375,0.06,25,1288,"Bozone Hefe Weizen","Hefeweizen",219,12,NA,220,"Bozeman Brewing Company","Bozeman","MT","Bozone Hefe Weizen (Bozeman Brewing Company)" +"376",376,0.055,NA,470,"Bozone Select Amber Ale","American Amber / Red Ale",219,12,"American Amber / Red Ale",220,"Bozeman Brewing Company","Bozeman","MT","Bozone Select Amber Ale (Bozeman Brewing Company)" +"377",377,0.052,40,2167,"Evil Owl","American Amber / Red Ale",207,12,"American Amber / Red Ale",208,"Branchline Brewing Company","San Antonio","TX","Evil Owl (Branchline Brewing Company)" +"378",378,0.05,NA,2204,"Post Time Kölsch","Kölsch",195,16,NA,196,"Breakside Brewery","Portland","OR","Post Time Kölsch (Breakside Brewery)" +"379",379,0.042,9,1522,"Agave Wheat","American Pale Wheat Ale",391,12,"American Pale Wheat Ale",392,"Breckenridge Brewery","Denver","CO","Agave Wheat (Breckenridge Brewery)" +"380",380,0.045,15,397,"SummerBright Ale","American Pale Wheat Ale",391,12,"American Pale Wheat Ale",392,"Breckenridge Brewery","Denver","CO","SummerBright Ale (Breckenridge Brewery)" +"381",381,0.062,68,193,"Lucky U IPA","American IPA",391,12,"American IPA",392,"Breckenridge Brewery","Denver","CO","Lucky U IPA (Breckenridge Brewery)" +"382",382,0.054,19,83,"Avalanche Ale","American Amber / Red Ale",391,12,"American Amber / Red Ale",392,"Breckenridge Brewery","Denver","CO","Avalanche Ale (Breckenridge Brewery)" +"383",383,0.05,NA,1802,"You're My Boy, Blue","Fruit / Vegetable Beer",308,12,NA,309,"Brew Bus Brewing","Tampa","FL","You're My Boy, Blue (Brew Bus Brewing)" +"384",384,0.072,60,1801,"Last Stop IPA","American IPA",308,12,"American IPA",309,"Brew Bus Brewing","Tampa","FL","Last Stop IPA (Brew Bus Brewing)" +"385",385,0.05,21,1800,"Rollin Dirty Red Ale","Irish Red Ale",308,12,NA,309,"Brew Bus Brewing","Tampa","FL","Rollin Dirty Red Ale (Brew Bus Brewing)" +"386",386,0.055,28,1799,"Are Wheat There Yet?","American Pale Wheat Ale",308,12,"American Pale Wheat Ale",309,"Brew Bus Brewing","Tampa","FL","Are Wheat There Yet? (Brew Bus Brewing)" +"387",387,0.0579999999999999,NA,2619,"Insert Hop Reference","American Pale Ale (APA)",19,16,"American Pale Ale (APA)",20,"Brew Link Brewing","Plainfield","IN","Insert Hop Reference (Brew Link Brewing)" +"388",388,0.053,NA,2468,"Manitou Amber","American Amber / Red Ale",85,16,"American Amber / Red Ale",86,"Brewery Terra Firma","Traverse City","MI","Manitou Amber (Brewery Terra Firma)" +"389",389,0.067,NA,2637,"Belfort","Saison / Farmhouse Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Belfort (Brewery Vivant)" +"390",390,0.06,NA,2636,"Star Runner","Belgian Pale Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Star Runner (Brewery Vivant)" +"391",391,0.098,NA,2598,"Tart Side of the Barrel","American Double / Imperial Stout",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Tart Side of the Barrel (Brewery Vivant)" +"392",392,0.06,NA,2597,"Linnaeus Mango IPA","American IPA",10,16,"American IPA",11,"Brewery Vivant","Grand Rapids","MI","Linnaeus Mango IPA (Brewery Vivant)" +"393",393,0.07,NA,2548,"Beasts A'Burnin'","Rauchbier",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Beasts A'Burnin' (Brewery Vivant)" +"394",394,0.077,NA,2542,"Verdun","Bière de Garde",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Verdun (Brewery Vivant)" +"395",395,0.065,NA,2541,"Barrel Aged Triomphe","Belgian IPA",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Barrel Aged Triomphe (Brewery Vivant)" +"396",396,0.065,NA,2504,"Cherry Doppelbock","Doppelbock",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Cherry Doppelbock (Brewery Vivant)" +"397",397,0.065,NA,2500,"Tropical Saison","Saison / Farmhouse Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Tropical Saison (Brewery Vivant)" +"398",398,0.065,NA,2499,"Beach Patrol","Witbier",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Beach Patrol (Brewery Vivant)" +"399",399,0.05,NA,2498,"Nuit Serpent","Belgian IPA",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Nuit Serpent (Brewery Vivant)" +"400",400,0.09,NA,2481,"Paris","Saison / Farmhouse Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Paris (Brewery Vivant)" +"401",401,0.055,NA,2476,"The Grand Army","Belgian IPA",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","The Grand Army (Brewery Vivant)" +"402",402,0.059,NA,2467,"Acidulated Trip","Saison / Farmhouse Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Acidulated Trip (Brewery Vivant)" +"403",403,0.066,NA,2466,"Root Stock","Rye Beer",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Root Stock (Brewery Vivant)" +"404",404,0.0409999999999999,NA,2465,"Mind Games","Dunkelweizen",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Mind Games (Brewery Vivant)" +"405",405,0.0819999999999999,NA,2433,"Sous Chef","Belgian Strong Pale Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Sous Chef (Brewery Vivant)" +"406",406,0.065,NA,2418,"Dubbelicious","Dubbel",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Dubbelicious (Brewery Vivant)" +"407",407,0.062,NA,2416,"Psychopomp","Belgian Dark Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Psychopomp (Brewery Vivant)" +"408",408,NA,NA,2382,"Fat Paczki","Belgian Dark Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Fat Paczki (Brewery Vivant)" +"409",409,NA,NA,2381,"Earth-Like Planets","Belgian Pale Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Earth-Like Planets (Brewery Vivant)" +"410",410,0.061,NA,2290,"Ski Patrol","Witbier",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Ski Patrol (Brewery Vivant)" +"411",411,0.063,NA,2241,"Viking Ice Hole","Oatmeal Stout",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Viking Ice Hole (Brewery Vivant)" +"412",412,0.0559999999999999,NA,2240,"Rye Porter","American Porter",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Rye Porter (Brewery Vivant)" +"413",413,0.099,NA,2137,"Wizard Burial Ground","Quadrupel (Quad)",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Wizard Burial Ground (Brewery Vivant)" +"414",414,0.051,NA,2101,"Smoky Wheat","Rauchbier",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Smoky Wheat (Brewery Vivant)" +"415",415,0.062,NA,2092,"BRIPA","Belgian IPA",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","BRIPA (Brewery Vivant)" +"416",416,0.062,NA,2091,"Mela","Belgian Dark Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Mela (Brewery Vivant)" +"417",417,0.053,NA,2086,"W.I.P.A Snappa","Belgian IPA",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","W.I.P.A Snappa (Brewery Vivant)" +"418",418,0.063,NA,2023,"Pepper in the Rye","Rye Beer",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Pepper in the Rye (Brewery Vivant)" +"419",419,0.064,NA,2006,"Moe Lasses'","American Stout",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Moe Lasses' (Brewery Vivant)" +"420",420,0.07,NA,1997,"Pumpkin Tart","Fruit / Vegetable Beer",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Pumpkin Tart (Brewery Vivant)" +"421",421,0.067,NA,1977,"Undertaker","Belgian Dark Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Undertaker (Brewery Vivant)" +"422",422,0.067,NA,1976,"Undertaker (2014)","Belgian Dark Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Undertaker (2014) (Brewery Vivant)" +"423",423,0.05,NA,1974,"Coq D'Or","Belgian Pale Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Coq D'Or (Brewery Vivant)" +"424",424,0.06,NA,1973,"North French","Bière de Garde",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","North French (Brewery Vivant)" +"425",425,0.065,NA,1959,"Agent a Deux","Belgian Dark Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Agent a Deux (Brewery Vivant)" +"426",426,0.045,NA,1958,"Belgian Wit","Witbier",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Belgian Wit (Brewery Vivant)" +"427",427,0.063,NA,1949,"Pothole Stout","American Stout",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Pothole Stout (Brewery Vivant)" +"428",428,0.093,NA,1947,"Tree Bucket","Belgian IPA",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Tree Bucket (Brewery Vivant)" +"429",429,0.073,NA,1785,"Le Flaneur Ale","American Wild Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Le Flaneur Ale (Brewery Vivant)" +"430",430,0.0559999999999999,NA,1651,"Maize & Blueberry","Fruit / Vegetable Beer",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Maize & Blueberry (Brewery Vivant)" +"431",431,0.093,NA,1443,"Trebuchet Double IPA","American Double / Imperial IPA",10,16,"American Double / Imperial IPA",11,"Brewery Vivant","Grand Rapids","MI","Trebuchet Double IPA (Brewery Vivant)" +"432",432,0.065,NA,1352,"Contemplation","Bière de Garde",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Contemplation (Brewery Vivant)" +"433",433,0.05,NA,1267,"Black Rabbit","American Black Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Black Rabbit (Brewery Vivant)" +"434",434,0.09,NA,1266,"Zaison","Saison / Farmhouse Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Zaison (Brewery Vivant)" +"435",435,0.0819999999999999,NA,1178,"Vivant Tripel","Tripel",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Vivant Tripel (Brewery Vivant)" +"436",436,0.098,NA,1136,"Tart Side of the Moon","Belgian Dark Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Tart Side of the Moon (Brewery Vivant)" +"437",437,0.06,NA,1044,"Big Red Coq","American Amber / Red Ale",10,16,"American Amber / Red Ale",11,"Brewery Vivant","Grand Rapids","MI","Big Red Coq (Brewery Vivant)" +"438",438,0.099,NA,1033,"Hubris Quadrupel Anniversary Ale","Quadrupel (Quad)",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Hubris Quadrupel Anniversary Ale (Brewery Vivant)" +"439",439,0.095,NA,1031,"Plow Horse Belgian Style Imperial Stout","American Double / Imperial Stout",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Plow Horse Belgian Style Imperial Stout (Brewery Vivant)" +"440",440,0.092,NA,909,"Escoffier Bretta Ale","American Wild Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Escoffier Bretta Ale (Brewery Vivant)" +"441",441,0.065,NA,873,"Contemplation (2012)","Bière de Garde",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Contemplation (2012) (Brewery Vivant)" +"442",442,0.099,NA,860,"Vivant Belgian Style Imperial Stout (2012)","Russian Imperial Stout",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Vivant Belgian Style Imperial Stout (2012) (Brewery Vivant)" +"443",443,0.062,NA,677,"Big Red Coq (2012)","American Amber / Red Ale",10,16,"American Amber / Red Ale",11,"Brewery Vivant","Grand Rapids","MI","Big Red Coq (2012) (Brewery Vivant)" +"444",444,0.09,NA,671,"Zaison (2012)","Saison / Farmhouse Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Zaison (2012) (Brewery Vivant)" +"445",445,0.092,NA,670,"Vivant Tripel (2012)","Tripel",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Vivant Tripel (2012) (Brewery Vivant)" +"446",446,0.0969999999999999,NA,669,"Trebuchet Double IPA (2012)","Belgian IPA",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Trebuchet Double IPA (2012) (Brewery Vivant)" +"447",447,0.085,NA,627,"Kludde","Belgian Strong Dark Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Kludde (Brewery Vivant)" +"448",448,0.055,NA,387,"Farm Hand","Saison / Farmhouse Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Farm Hand (Brewery Vivant)" +"449",449,0.06,NA,385,"Solitude","Belgian Pale Ale",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Solitude (Brewery Vivant)" +"450",450,0.065,NA,384,"Triomphe","Belgian IPA",10,16,NA,11,"Brewery Vivant","Grand Rapids","MI","Triomphe (Brewery Vivant)" +"451",451,NA,NA,1096,"Tampa Pale Ale","American Pale Ale (APA)",467,12,"American Pale Ale (APA)",468,"Brindle Dog Brewing Company","Tampa Bay","FL","Tampa Pale Ale (Brindle Dog Brewing Company)" +"452",452,NA,NA,1095,"Orange Grove Wheat Ale","American Pale Wheat Ale",467,12,"American Pale Wheat Ale",468,"Brindle Dog Brewing Company","Tampa Bay","FL","Orange Grove Wheat Ale (Brindle Dog Brewing Company)" +"453",453,0.061,NA,2456,"Broad Brook Ale","American Amber / Red Ale",89,16,"American Amber / Red Ale",90,"Broad Brook Brewing LLC","East Windsor","CT","Broad Brook Ale (Broad Brook Brewing LLC)" +"454",454,0.05,15,921,"Northern Lights Amber Ale","American Amber / Red Ale",493,12,"American Amber / Red Ale",494,"Broken Tooth Brewing Company","Anchorage","AK","Northern Lights Amber Ale (Broken Tooth Brewing Company)" +"455",455,0.052,17,920,"Polar Pale Ale","American Pale Ale (APA)",493,12,"American Pale Ale (APA)",494,"Broken Tooth Brewing Company","Anchorage","AK","Polar Pale Ale (Broken Tooth Brewing Company)" +"456",456,0.048,NA,919,"Chugach Session Ale","Cream Ale",493,12,NA,494,"Broken Tooth Brewing Company","Anchorage","AK","Chugach Session Ale (Broken Tooth Brewing Company)" +"457",457,0.061,64,648,"Fairweather IPA","American IPA",493,12,"American IPA",494,"Broken Tooth Brewing Company","Anchorage","AK","Fairweather IPA (Broken Tooth Brewing Company)" +"458",458,0.068,47,1279,"East India Pale Ale","English India Pale Ale (IPA)",437,16,NA,438,"Brooklyn Brewery","Brooklyn","NY","East India Pale Ale (Brooklyn Brewery)" +"459",459,0.045,NA,756,"Brooklyn Summer Ale","English Pale Mild Ale",437,12,NA,438,"Brooklyn Brewery","Brooklyn","NY","Brooklyn Summer Ale (Brooklyn Brewery)" +"460",460,0.068,47,566,"East India Pale Ale","English India Pale Ale (IPA)",437,12,NA,438,"Brooklyn Brewery","Brooklyn","NY","East India Pale Ale (Brooklyn Brewery)" +"461",461,0.045,NA,328,"Brooklyn Summer Ale (2011)","English Pale Mild Ale",437,12,NA,438,"Brooklyn Brewery","Brooklyn","NY","Brooklyn Summer Ale (2011) (Brooklyn Brewery)" +"462",462,0.052,NA,66,"Brooklyn Lager (16 oz.)","American Amber / Red Lager",437,16,NA,438,"Brooklyn Brewery","Brooklyn","NY","Brooklyn Lager (16 oz.) (Brooklyn Brewery)" +"463",463,0.052,NA,65,"Brooklyn Lager (12 oz.)","American Amber / Red Lager",437,12,NA,438,"Brooklyn Brewery","Brooklyn","NY","Brooklyn Lager (12 oz.) (Brooklyn Brewery)" +"464",464,0.08,NA,538,"Tour de Nez Belgian IPA (Current)","Belgian IPA",530,16,NA,531,"Buckbean Brewing Company","Reno","NV","Tour de Nez Belgian IPA (Current) (Buckbean Brewing Company)" +"465",465,NA,NA,504,"Roler Bock (Current)","Maibock / Helles Bock",530,16,NA,531,"Buckbean Brewing Company","Reno","NV","Roler Bock (Current) (Buckbean Brewing Company)" +"466",466,0.073,85,383,"Black Adder IBA (Current)","American Black Ale",530,16,NA,531,"Buckbean Brewing Company","Reno","NV","Black Adder IBA (Current) (Buckbean Brewing Company)" +"467",467,0.099,NA,29,"Very Noddy Lager (Current)","Schwarzbier",530,16,NA,531,"Buckbean Brewing Company","Reno","NV","Very Noddy Lager (Current) (Buckbean Brewing Company)" +"468",468,0.062,42,28,"Tule Duck Red Ale (Current)","American Amber / Red Ale",530,16,"American Amber / Red Ale",531,"Buckbean Brewing Company","Reno","NV","Tule Duck Red Ale (Current) (Buckbean Brewing Company)" +"469",469,0.0579999999999999,35,27,"Original Orange Blossom Ale (Current)","Herbed / Spiced Beer",530,16,NA,531,"Buckbean Brewing Company","Reno","NV","Original Orange Blossom Ale (Current) (Buckbean Brewing Company)" +"470",470,0.052,40,26,"Black Noddy Lager (Current)","Schwarzbier",530,16,NA,531,"Buckbean Brewing Company","Reno","NV","Black Noddy Lager (Current) (Buckbean Brewing Company)" +"471",471,0.053,NA,1627,"Cleveland Beer Week 2013","Munich Helles Lager",357,16,NA,358,"Buckeye Brewing","Cleveland","OH","Cleveland Beer Week 2013 (Buckeye Brewing)" +"472",472,0.045,NA,2552,"Painted Turtle","American Pale Ale (APA)",56,12,"American Pale Ale (APA)",57,"BuckleDown Brewing","Lyons","IL","Painted Turtle (BuckleDown Brewing)" +"473",473,0.06,40,2125,"1836","American Blonde Ale",214,12,"American Blonde Ale",215,"Buffalo Bayou Brewing Company","Houston","TX","1836 (Buffalo Bayou Brewing Company)" +"474",474,0.06,20,2124,"Summer's Wit","Witbier",214,12,NA,215,"Buffalo Bayou Brewing Company","Houston","TX","Summer's Wit (Buffalo Bayou Brewing Company)" +"475",475,0.09,118,2123,"More Cowbell","American Double / Imperial IPA",214,16,"American Double / Imperial IPA",215,"Buffalo Bayou Brewing Company","Houston","TX","More Cowbell (Buffalo Bayou Brewing Company)" +"476",476,0.065,NA,2608,"Wrath of Pele","American Brown Ale",24,16,NA,25,"Burn 'Em Brewing","Michigan City","IN","Wrath of Pele (Burn 'Em Brewing)" +"477",477,0.068,NA,2607,"Black Beer'd","American Black Ale",24,16,NA,25,"Burn 'Em Brewing","Michigan City","IN","Black Beer'd (Burn 'Em Brewing)" +"478",478,0.078,NA,2606,"Mr. Tea","Fruit / Vegetable Beer",24,24,NA,25,"Burn 'Em Brewing","Michigan City","IN","Mr. Tea (Burn 'Em Brewing)" +"479",479,0.055,40,2478,"Pale Alement","American Pale Ale (APA)",24,12,"American Pale Ale (APA)",25,"Burn 'Em Brewing","Michigan City","IN","Pale Alement (Burn 'Em Brewing)" +"480",480,0.099,115,2471,"Hopkick Dropkick","American Double / Imperial IPA",24,12,"American Double / Imperial IPA",25,"Burn 'Em Brewing","Michigan City","IN","Hopkick Dropkick (Burn 'Em Brewing)" +"481",481,0.06,NA,2470,"Kreamed Corn","Cream Ale",24,12,NA,25,"Burn 'Em Brewing","Michigan City","IN","Kreamed Corn (Burn 'Em Brewing)" +"482",482,0.065,NA,2464,"Coconoats","American Pale Wheat Ale",24,16,"American Pale Wheat Ale",25,"Burn 'Em Brewing","Michigan City","IN","Coconoats (Burn 'Em Brewing)" +"483",483,0.068,16,2160,"Joey Wheat","American Pale Wheat Ale",24,16,"American Pale Wheat Ale",25,"Burn 'Em Brewing","Michigan City","IN","Joey Wheat (Burn 'Em Brewing)" +"484",484,0.072,86,2158,"3:33 Black IPA","American IPA",24,16,"American IPA",25,"Burn 'Em Brewing","Michigan City","IN","3:33 Black IPA (Burn 'Em Brewing)" +"485",485,0.068,NA,2072,"MCA","American IPA",24,16,"American IPA",25,"Burn 'Em Brewing","Michigan City","IN","MCA (Burn 'Em Brewing)" +"486",486,0.055,40,2054,"Pale Alement","American Pale Ale (APA)",24,16,"American Pale Ale (APA)",25,"Burn 'Em Brewing","Michigan City","IN","Pale Alement (Burn 'Em Brewing)" +"487",487,0.05,14,2196,"Couch Select Lager","American Pale Lager",197,12,NA,198,"Burnside Brewing Co.","Portland","OR","Couch Select Lager (Burnside Brewing Co.)" +"488",488,0.0559999999999999,36,668,"Mucho Aloha Hawaiian Pale Ale","American Pale Ale (APA)",517,12,"American Pale Ale (APA)",518,"Butcher's Brewing","Carlsbad","CA","Mucho Aloha Hawaiian Pale Ale (Butcher's Brewing)" +"489",489,0.049,NA,52,"Heinnieweisse Weissebier","Hefeweizen",556,12,NA,557,"Butternuts Beer and Ale","Garrattsville","NY","Heinnieweisse Weissebier (Butternuts Beer and Ale)" +"490",490,0.068,NA,51,"Snapperhead IPA","American IPA",556,12,"American IPA",557,"Butternuts Beer and Ale","Garrattsville","NY","Snapperhead IPA (Butternuts Beer and Ale)" +"491",491,0.049,NA,50,"Moo Thunder Stout","Milk / Sweet Stout",556,12,NA,557,"Butternuts Beer and Ale","Garrattsville","NY","Moo Thunder Stout (Butternuts Beer and Ale)" +"492",492,0.043,NA,49,"Porkslap Pale Ale","American Pale Ale (APA)",556,12,"American Pale Ale (APA)",557,"Butternuts Beer and Ale","Garrattsville","NY","Porkslap Pale Ale (Butternuts Beer and Ale)" +"493",493,0.093,NA,2657,"Blackbeard","American Double / Imperial Stout",5,12,NA,6,"COAST Brewing Company","Charleston","SC","Blackbeard (COAST Brewing Company)" +"494",494,0.062,NA,2656,"Rye Knot","American Brown Ale",5,12,NA,6,"COAST Brewing Company","Charleston","SC","Rye Knot (COAST Brewing Company)" +"495",495,0.06,NA,2655,"Dead Arm","American Pale Ale (APA)",5,12,"American Pale Ale (APA)",6,"COAST Brewing Company","Charleston","SC","Dead Arm (COAST Brewing Company)" +"496",496,0.048,NA,2654,"32°/50° Kölsch","Kölsch",5,16,NA,6,"COAST Brewing Company","Charleston","SC","32°/50° Kölsch (COAST Brewing Company)" +"497",497,0.077,NA,2653,"HopArt","American IPA",5,16,"American IPA",6,"COAST Brewing Company","Charleston","SC","HopArt (COAST Brewing Company)" +"498",498,0.0969999999999999,NA,2652,"Boy King","American Double / Imperial IPA",5,16,"American Double / Imperial IPA",6,"COAST Brewing Company","Charleston","SC","Boy King (COAST Brewing Company)" +"499",499,0.052,NA,2252,"Gran Sport","American Porter",182,16,NA,183,"COOP Ale Works","Oklahoma City","OK","Gran Sport (COOP Ale Works)" +"500",500,0.053,25,2214,"Horny Toad Cerveza","American Blonde Ale",182,16,"American Blonde Ale",183,"COOP Ale Works","Oklahoma City","OK","Horny Toad Cerveza (COOP Ale Works)" +"501",501,0.063,35,2213,"Native Amber","American Amber / Red Ale",182,16,"American Amber / Red Ale",183,"COOP Ale Works","Oklahoma City","OK","Native Amber (COOP Ale Works)" +"502",502,0.068,100,1442,"F5 IPA","American IPA",182,16,"American IPA",183,"COOP Ale Works","Oklahoma City","OK","F5 IPA (COOP Ale Works)" +"503",503,0.063,35,170,"Native Amber (2013)","American Amber / Red Ale",182,16,"American Amber / Red Ale",183,"COOP Ale Works","Oklahoma City","OK","Native Amber (2013) (COOP Ale Works)" +"504",504,0.053,25,169,"Horny Toad Cerveza (2013)","American Blonde Ale",182,16,"American Blonde Ale",183,"COOP Ale Works","Oklahoma City","OK","Horny Toad Cerveza (2013) (COOP Ale Works)" +"505",505,0.068,100,2315,"Hopportunity Knocks IPA","American IPA",155,12,"American IPA",156,"Caldera Brewing Company","Ashland","OR","Hopportunity Knocks IPA (Caldera Brewing Company)" +"506",506,0.06,NA,1808,"Pilot Rock Porter","American Porter",155,12,NA,156,"Caldera Brewing Company","Ashland","OR","Pilot Rock Porter (Caldera Brewing Company)" +"507",507,0.0559999999999999,55,1419,"Caldera Pale Ale","American Pale Ale (APA)",155,12,"American Pale Ale (APA)",156,"Caldera Brewing Company","Ashland","OR","Caldera Pale Ale (Caldera Brewing Company)" +"508",508,0.039,16,878,"Lawnmower Lager","American Adjunct Lager",155,12,NA,156,"Caldera Brewing Company","Ashland","OR","Lawnmower Lager (Caldera Brewing Company)" +"509",509,0.054,24,794,"Ashland Amber Ale (2009)","American Amber / Red Ale",155,12,"American Amber / Red Ale",156,"Caldera Brewing Company","Ashland","OR","Ashland Amber Ale (2009) (Caldera Brewing Company)" +"510",510,0.061,94,793,"Caldera IPA (2009)","American IPA",155,12,"American IPA",156,"Caldera Brewing Company","Ashland","OR","Caldera IPA (2009) (Caldera Brewing Company)" +"511",511,0.061,94,792,"Caldera IPA (2007)","American IPA",155,12,"American IPA",156,"Caldera Brewing Company","Ashland","OR","Caldera IPA (2007) (Caldera Brewing Company)" +"512",512,0.0559999999999999,55,791,"Caldera Pale Ale (2010)","American Pale Ale (APA)",155,12,"American Pale Ale (APA)",156,"Caldera Brewing Company","Ashland","OR","Caldera Pale Ale (2010) (Caldera Brewing Company)" +"513",513,0.0559999999999999,55,790,"Caldera Pale Ale (2009)","American Pale Ale (APA)",155,12,"American Pale Ale (APA)",156,"Caldera Brewing Company","Ashland","OR","Caldera Pale Ale (2009) (Caldera Brewing Company)" +"514",514,0.0559999999999999,55,789,"Caldera Pale Ale (2005)","American Pale Ale (APA)",155,12,"American Pale Ale (APA)",156,"Caldera Brewing Company","Ashland","OR","Caldera Pale Ale (2005) (Caldera Brewing Company)" +"515",515,0.0559999999999999,55,788,"Caldera Pale Ale (2007)","American Pale Ale (APA)",155,12,"American Pale Ale (APA)",156,"Caldera Brewing Company","Ashland","OR","Caldera Pale Ale (2007) (Caldera Brewing Company)" +"516",516,0.0559999999999999,55,38,"Caldera Pale Ale (2011)","American Pale Ale (APA)",155,12,"American Pale Ale (APA)",156,"Caldera Brewing Company","Ashland","OR","Caldera Pale Ale (2011) (Caldera Brewing Company)" +"517",517,0.054,24,37,"Ashland Amber Ale","American Amber / Red Ale",155,12,"American Amber / Red Ale",156,"Caldera Brewing Company","Ashland","OR","Ashland Amber Ale (Caldera Brewing Company)" +"518",518,0.061,94,36,"Caldera IPA","American IPA",155,12,"American IPA",156,"Caldera Brewing Company","Ashland","OR","Caldera IPA (Caldera Brewing Company)" +"519",519,0.05,NA,2257,"Remain in Light","American Pilsner",178,12,NA,179,"Cambridge Brewing Company","Cambridge","MA","Remain in Light (Cambridge Brewing Company)" +"520",520,0.065,NA,2256,"Flower Child (2014)","American IPA",178,12,"American IPA",179,"Cambridge Brewing Company","Cambridge","MA","Flower Child (2014) (Cambridge Brewing Company)" +"521",521,NA,NA,870,"THP White (2006)","Witbier",497,12,NA,498,"Cans Bar and Canteen","Charlotte","NC","THP White (2006) (Cans Bar and Canteen)" +"522",522,NA,NA,869,"THP Amber (2006)","American Amber / Red Ale",497,12,"American Amber / Red Ale",498,"Cans Bar and Canteen","Charlotte","NC","THP Amber (2006) (Cans Bar and Canteen)" +"523",523,NA,NA,868,"THP Light (2006)","American Blonde Ale",497,12,"American Blonde Ale",498,"Cans Bar and Canteen","Charlotte","NC","THP Light (2006) (Cans Bar and Canteen)" +"524",524,NA,NA,867,"THP Dark (2006)","English Dark Mild Ale",497,12,NA,498,"Cans Bar and Canteen","Charlotte","NC","THP Dark (2006) (Cans Bar and Canteen)" +"525",525,0.099,43,2068,"Imperial Pumpkin Stout","Pumpkin Ale",230,16,NA,231,"Cape Ann Brewing Company","Gloucester","MA","Imperial Pumpkin Stout (Cape Ann Brewing Company)" +"526",526,0.09,130,2067,"Dead-Eye DIPA","American Double / Imperial IPA",230,16,"American Double / Imperial IPA",231,"Cape Ann Brewing Company","Gloucester","MA","Dead-Eye DIPA (Cape Ann Brewing Company)" +"527",527,0.055,64,2066,"Fisherman's IPA","American IPA",230,12,"American IPA",231,"Cape Ann Brewing Company","Gloucester","MA","Fisherman's IPA (Cape Ann Brewing Company)" +"528",528,0.054,35,2065,"Fisherman's Pils","German Pilsener",230,12,NA,231,"Cape Ann Brewing Company","Gloucester","MA","Fisherman's Pils (Cape Ann Brewing Company)" +"529",529,0.055,30,2064,"Fisherman's Brew","American Amber / Red Ale",230,12,"American Amber / Red Ale",231,"Cape Ann Brewing Company","Gloucester","MA","Fisherman's Brew (Cape Ann Brewing Company)" +"530",530,0.055,35,1928,"Cape Cod Red","American Amber / Red Ale",267,16,"American Amber / Red Ale",268,"Cape Cod Beer","Hyannis","MA","Cape Cod Red (Cape Cod Beer)" +"531",531,0.049,10,1927,"Beach Blonde","American Blonde Ale",267,16,"American Blonde Ale",268,"Cape Cod Beer","Hyannis","MA","Beach Blonde (Cape Cod Beer)" +"532",532,0.065,80,2227,"Dark Voyage Black IPA (2013)","American Black Ale",192,12,NA,193,"Capital Brewery","Middleton","WI","Dark Voyage Black IPA (2013) (Capital Brewery)" +"533",533,0.052,28,2226,"Wisconsin Amber","Vienna Lager",192,12,NA,193,"Capital Brewery","Middleton","WI","Wisconsin Amber (Capital Brewery)" +"534",534,0.046,18,2225,"Lake House","Munich Helles Lager",192,12,NA,193,"Capital Brewery","Middleton","WI","Lake House (Capital Brewery)" +"535",535,0.0559999999999999,55,1954,"Ghost Ship White IPA","American IPA",192,12,"American IPA",193,"Capital Brewery","Middleton","WI","Ghost Ship White IPA (Capital Brewery)" +"536",536,0.046,18,1910,"Lake House","Munich Helles Lager",192,16,NA,193,"Capital Brewery","Middleton","WI","Lake House (Capital Brewery)" +"537",537,0.062,70,1177,"Mutiny IPA","American IPA",192,12,"American IPA",193,"Capital Brewery","Middleton","WI","Mutiny IPA (Capital Brewery)" +"538",538,0.052,NA,840,"Wisconsin Amber (1998)","Vienna Lager",192,12,NA,193,"Capital Brewery","Middleton","WI","Wisconsin Amber (1998) (Capital Brewery)" +"539",539,0.042,NA,180,"Island Wheat","American Pale Wheat Ale",192,12,"American Pale Wheat Ale",193,"Capital Brewery","Middleton","WI","Island Wheat (Capital Brewery)" +"540",540,0.052,NA,63,"Wisconsin Amber (2013)","Vienna Lager",192,12,NA,193,"Capital Brewery","Middleton","WI","Wisconsin Amber (2013) (Capital Brewery)" +"541",541,0.05,NA,62,"U.S. Pale Ale","American Pale Ale (APA)",192,12,"American Pale Ale (APA)",193,"Capital Brewery","Middleton","WI","U.S. Pale Ale (Capital Brewery)" +"542",542,NA,NA,61,"Supper Club Lager","American Pale Lager",192,12,NA,193,"Capital Brewery","Middleton","WI","Supper Club Lager (Capital Brewery)" +"543",543,0.04,NA,784,"Carolina Lighthouse (2007)","American Blonde Ale",504,12,"American Blonde Ale",505,"Carolina Beer & Beverage","Mooresville","NC","Carolina Lighthouse (2007) (Carolina Beer & Beverage)" +"544",544,0.05,NA,783,"Carolina Blonde (2006)","American Blonde Ale",504,12,"American Blonde Ale",505,"Carolina Beer & Beverage","Mooresville","NC","Carolina Blonde (2006) (Carolina Beer & Beverage)" +"545",545,0.035,NA,782,"Carolina Blonde Light (2005)","American Blonde Ale",504,12,"American Blonde Ale",505,"Carolina Beer & Beverage","Mooresville","NC","Carolina Blonde Light (2005) (Carolina Beer & Beverage)" +"546",546,0.059,22,2255,"Santa's Secret","Winter Warmer",179,16,NA,180,"Carolina Brewery","Pittsboro","NC","Santa's Secret (Carolina Brewery)" +"547",547,0.057,NA,530,"Flagship IPA","English India Pale Ale (IPA)",179,12,NA,180,"Carolina Brewery","Pittsboro","NC","Flagship IPA (Carolina Brewery)" +"548",548,0.051,NA,427,"Sky Blue Golden Ale","Kölsch",179,12,NA,180,"Carolina Brewery","Pittsboro","NC","Sky Blue Golden Ale (Carolina Brewery)" +"549",549,0.099,100,2094,"Epitome","American Black Ale",222,16,NA,223,"Carton Brewing Company","Atlantic Highlands","NJ","Epitome (Carton Brewing Company)" +"550",550,0.039,9,1941,"Monkey Chased the Weasel","Berliner Weissbier",222,16,NA,223,"Carton Brewing Company","Atlantic Highlands","NJ","Monkey Chased the Weasel (Carton Brewing Company)" +"551",551,0.078,80,1940,"077XX","American Double / Imperial IPA",222,16,"American Double / Imperial IPA",223,"Carton Brewing Company","Atlantic Highlands","NJ","077XX (Carton Brewing Company)" +"552",552,0.042,35,1439,"Boat Beer","American IPA",222,12,"American IPA",223,"Carton Brewing Company","Atlantic Highlands","NJ","Boat Beer (Carton Brewing Company)" +"553",553,0.069,NA,1465,"Granny Smith Hard Apple Cider","Cider",404,16,NA,405,"Cascadia Ciderworks United","Portland","OR","Granny Smith Hard Apple Cider (Cascadia Ciderworks United)" +"554",554,0.069,NA,1464,"Dry Hard Apple Cider","Cider",404,16,NA,405,"Cascadia Ciderworks United","Portland","OR","Dry Hard Apple Cider (Cascadia Ciderworks United)" +"555",555,0.0559999999999999,NA,1744,"Farmer Ted's Cream Ale","Cream Ale",331,12,NA,332,"Catawba Brewing Company","Morganton","NC","Farmer Ted's Cream Ale (Catawba Brewing Company)" +"556",556,0.052,NA,1743,"Firewater India Pale Ale","American IPA",331,12,"American IPA",332,"Catawba Brewing Company","Morganton","NC","Firewater India Pale Ale (Catawba Brewing Company)" +"557",557,0.047,NA,1742,"White Zombie Ale","Witbier",331,12,NA,332,"Catawba Brewing Company","Morganton","NC","White Zombie Ale (Catawba Brewing Company)" +"558",558,0.07,NA,1719,"King Winterbolt Winter Ale","Winter Warmer",331,12,NA,332,"Catawba Brewing Company","Morganton","NC","King Winterbolt Winter Ale (Catawba Brewing Company)" +"559",559,0.047,NA,638,"White Zombie Ale","Witbier",331,12,NA,332,"Catawba Brewing Company","Morganton","NC","White Zombie Ale (Catawba Brewing Company)" +"560",560,0.052,NA,507,"Firewater India Pale Ale","American IPA",331,12,"American IPA",332,"Catawba Brewing Company","Morganton","NC","Firewater India Pale Ale (Catawba Brewing Company)" +"561",561,0.0559999999999999,NA,480,"Farmer Ted's Farmhouse Cream Ale","Cream Ale",331,12,NA,332,"Catawba Brewing Company","Morganton","NC","Farmer Ted's Farmhouse Cream Ale (Catawba Brewing Company)" +"562",562,0.048,16,1882,"Whitecap Wit","Witbier",285,16,NA,286,"Catawba Island Brewing","Port Clinton","OH","Whitecap Wit (Catawba Island Brewing)" +"563",563,0.078,16,1881,"Seiche Scottish Ale","Scottish Ale",285,16,NA,286,"Catawba Island Brewing","Port Clinton","OH","Seiche Scottish Ale (Catawba Island Brewing)" +"564",564,0.0579999999999999,NA,2446,"Peanut Butter Jelly Time","American Brown Ale",96,12,NA,97,"Catawba Valley Brewing Company","Morganton","NC","Peanut Butter Jelly Time (Catawba Valley Brewing Company)" +"565",565,0.054,NA,2106,"King Coconut","American Porter",96,12,NA,97,"Catawba Valley Brewing Company","Morganton","NC","King Coconut (Catawba Valley Brewing Company)" +"566",566,0.085,90,2600,"Gone A-Rye","American Double / Imperial IPA",29,16,"American Double / Imperial IPA",30,"Cedar Creek Brewery","Seven Points","TX","Gone A-Rye (Cedar Creek Brewery)" +"567",567,NA,NA,2210,"Special Release",NA,29,16,NA,30,"Cedar Creek Brewery","Seven Points","TX","Special Release (Cedar Creek Brewery)" +"568",568,0.068,70,2052,"Dankosaurus","American IPA",29,16,"American IPA",30,"Cedar Creek Brewery","Seven Points","TX","Dankosaurus (Cedar Creek Brewery)" +"569",569,0.051,35,1584,"Scruffy's Smoked Alt","Smoked Beer",29,16,NA,30,"Cedar Creek Brewery","Seven Points","TX","Scruffy's Smoked Alt (Cedar Creek Brewery)" +"570",570,0.051,36,1182,"Elliott's Phoned Home Pale Ale","American Pale Ale (APA)",29,16,"American Pale Ale (APA)",30,"Cedar Creek Brewery","Seven Points","TX","Elliott's Phoned Home Pale Ale (Cedar Creek Brewery)" +"571",571,0.05,18,1050,"The Lawn Ranger","Cream Ale",29,16,NA,30,"Cedar Creek Brewery","Seven Points","TX","The Lawn Ranger (Cedar Creek Brewery)" +"572",572,0.05,NA,1219,"All American Blonde Ale","American Blonde Ale",452,12,"American Blonde Ale",453,"Centennial Beer Company","Edwards","CO","All American Blonde Ale (Centennial Beer Company)" +"573",573,0.05,NA,1218,"All American Red Ale","American Amber / Red Ale",452,12,"American Amber / Red Ale",453,"Centennial Beer Company","Edwards","CO","All American Red Ale (Centennial Beer Company)" +"574",574,0.05,40,2377,"Main St. Virginia Ale","Altbier",122,12,NA,123,"Center of the Universe Brewing C...","Ashland","VA","Main St. Virginia Ale (Center of the Universe Brewing C...)" +"575",575,0.045,24,1839,"Chin Music Amber Lager","American Amber / Red Lager",122,12,NA,123,"Center of the Universe Brewing C...","Ashland","VA","Chin Music Amber Lager (Center of the Universe Brewing C...)" +"576",576,0.05,40,1248,"Main St. Virginia Ale","Altbier",122,12,NA,123,"Center of the Universe Brewing C...","Ashland","VA","Main St. Virginia Ale (Center of the Universe Brewing C...)" +"577",577,0.052,42,1247,"Ray Ray’s Pale Ale","American Pale Ale (APA)",122,12,"American Pale Ale (APA)",123,"Center of the Universe Brewing C...","Ashland","VA","Ray Ray’s Pale Ale (Center of the Universe Brewing C...)" +"578",578,0.051,15,1649,"Chai Ale","Herbed / Spiced Beer",350,16,NA,351,"Central Coast Brewing Company","San Luis Obispo","CA","Chai Ale (Central Coast Brewing Company)" +"579",579,0.072,85,1648,"Lucky Day IPA","American IPA",350,16,"American IPA",351,"Central Coast Brewing Company","San Luis Obispo","CA","Lucky Day IPA (Central Coast Brewing Company)" +"580",580,0.095,99,1647,"Terrace Hill Double IPA","American Double / Imperial IPA",350,16,"American Double / Imperial IPA",351,"Central Coast Brewing Company","San Luis Obispo","CA","Terrace Hill Double IPA (Central Coast Brewing Company)" +"581",581,0.075,77,1646,"Catch 23","American Black Ale",350,16,NA,351,"Central Coast Brewing Company","San Luis Obispo","CA","Catch 23 (Central Coast Brewing Company)" +"582",582,0.07,NA,2057,"Stickin' In My Rye","Rye Beer",236,24,NA,237,"Champion Brewing Company","Charlottesville","VA","Stickin' In My Rye (Champion Brewing Company)" +"583",583,0.06,45,2056,"Black Me Stout","American Stout",236,12,NA,237,"Champion Brewing Company","Charlottesville","VA","Black Me Stout (Champion Brewing Company)" +"584",584,0.05,22,2055,"Killer Kolsch","Kölsch",236,12,NA,237,"Champion Brewing Company","Charlottesville","VA","Killer Kolsch (Champion Brewing Company)" +"585",585,0.07,65,1933,"Missile IPA","American IPA",236,12,"American IPA",237,"Champion Brewing Company","Charlottesville","VA","Missile IPA (Champion Brewing Company)" +"586",586,0.045,NA,2019,"Enlighten","Kölsch",250,16,NA,251,"Chapman's Brewing","Angola","IN","Enlighten (Chapman's Brewing)" +"587",587,0.065,8,2018,"Ale Cider","Fruit / Vegetable Beer",250,16,NA,251,"Chapman's Brewing","Angola","IN","Ale Cider (Chapman's Brewing)" +"588",588,0.055,30,2017,"Pail Ale","American Pale Ale (APA)",250,16,"American Pale Ale (APA)",251,"Chapman's Brewing","Angola","IN","Pail Ale (Chapman's Brewing)" +"589",589,0.045,NA,2016,"Englishman","English Brown Ale",250,16,NA,251,"Chapman's Brewing","Angola","IN","Englishman (Chapman's Brewing)" +"590",590,0.08,69,2080,"8 Barrel","American Strong Ale",226,16,NA,227,"Chatham Brewing","Chatham","NY","8 Barrel (Chatham Brewing)" +"591",591,0.055,40,2079,"Oktoberfest","Märzen / Oktoberfest",226,16,NA,227,"Chatham Brewing","Chatham","NY","Oktoberfest (Chatham Brewing)" +"592",592,0.057,58,2380,"IPA #11","American IPA",121,16,"American IPA",122,"Cheboygan Brewing Company","Cheboygan","MI","IPA #11 (Cheboygan Brewing Company)" +"593",593,0.057,10,2379,"Blood Orange Honey","Fruit / Vegetable Beer",121,16,NA,122,"Cheboygan Brewing Company","Cheboygan","MI","Blood Orange Honey (Cheboygan Brewing Company)" +"594",594,0.052,NA,2354,"Lighthouse Amber","Altbier",121,16,NA,122,"Cheboygan Brewing Company","Cheboygan","MI","Lighthouse Amber (Cheboygan Brewing Company)" +"595",595,0.089,126,2440,"Bay of Bengal Double IPA (2014)","American Double / Imperial IPA",99,12,"American Double / Imperial IPA",100,"Christian Moerlein Brewing Company","Cincinnati","OH","Bay of Bengal Double IPA (2014) (Christian Moerlein Brewing Company)" +"596",596,0.049,29,567,"Churchkey Pilsner Style Beer","American Pilsner",526,12,NA,527,"Churchkey Can Company","Seattle","WA","Churchkey Pilsner Style Beer (Churchkey Can Company)" +"597",597,0.05,NA,1342,"First Press","Cider",425,12,NA,426,"Ciderboys","Stevens Point","WI","First Press (Ciderboys)" +"598",598,0.05,NA,1341,"Magic Apple","Cider",425,12,NA,426,"Ciderboys","Stevens Point","WI","Magic Apple (Ciderboys)" +"599",599,0.055,25,2349,"Cubano Espresso","Bock",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Cubano Espresso (Cigar City Brewing Company)" +"600",600,0.062,65,2014,"Operation Homefront","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Operation Homefront (Cigar City Brewing Company)" +"601",601,0.0819999999999999,65,2013,"Wandering Pelican","American Black Ale",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Wandering Pelican (Cigar City Brewing Company)" +"602",602,0.055,NA,2012,"Sugar Plum","American Brown Ale",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Sugar Plum (Cigar City Brewing Company)" +"603",603,0.055,NA,2011,"Oktoberfest","Märzen / Oktoberfest",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Oktoberfest (Cigar City Brewing Company)" +"604",604,0.06,NA,2010,"Puppy's Breath Porter","American Porter",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Puppy's Breath Porter (Cigar City Brewing Company)" +"605",605,0.045,NA,2009,"Happening Now","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Happening Now (Cigar City Brewing Company)" +"606",606,0.07,60,1726,"Hopped on the High Seas (Hop #529)","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Hopped on the High Seas (Hop #529) (Cigar City Brewing Company)" +"607",607,0.07,60,1725,"Hopped on the High Seas (Calypso)","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Hopped on the High Seas (Calypso) (Cigar City Brewing Company)" +"608",608,0.063,NA,1695,"Wiregrass Post-Prohibition Ale","American Pale Ale (APA)",141,12,"American Pale Ale (APA)",142,"Cigar City Brewing Company","Tampa","FL","Wiregrass Post-Prohibition Ale (Cigar City Brewing Company)" +"609",609,0.07,60,1694,"Dry-Hopped On The High Seas Caribbean-Style IPA","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Dry-Hopped On The High Seas Caribbean-Style IPA (Cigar City Brewing Company)" +"610",610,0.07,60,1693,"Hopped on the High Seas (Citra)","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Hopped on the High Seas (Citra) (Cigar City Brewing Company)" +"611",611,0.07,60,1692,"Hopped on the High Seas (Ahtanum)","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Hopped on the High Seas (Ahtanum) (Cigar City Brewing Company)" +"612",612,0.055,NA,1369,"Gwar Beer","American Pale Ale (APA)",141,12,"American Pale Ale (APA)",142,"Cigar City Brewing Company","Tampa","FL","Gwar Beer (Cigar City Brewing Company)" +"613",613,0.052,NA,1243,"Tropical Heatwave","American Pale Wheat Ale",141,16,"American Pale Wheat Ale",142,"Cigar City Brewing Company","Tampa","FL","Tropical Heatwave (Cigar City Brewing Company)" +"614",614,0.075,70,1142,"Humidor Series India Pale Ale","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Humidor Series India Pale Ale (Cigar City Brewing Company)" +"615",615,0.075,70,1141,"Jai Alai IPA Aged on White Oak","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Jai Alai IPA Aged on White Oak (Cigar City Brewing Company)" +"616",616,0.08,65,1140,"José Martí American Porter","American Porter",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","José Martí American Porter (Cigar City Brewing Company)" +"617",617,0.05,NA,1139,"Invasion Pale Ale","American Pale Ale (APA)",141,12,"American Pale Ale (APA)",142,"Cigar City Brewing Company","Tampa","FL","Invasion Pale Ale (Cigar City Brewing Company)" +"618",618,0.055,25,1138,"Maduro Brown Ale","English Brown Ale",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Maduro Brown Ale (Cigar City Brewing Company)" +"619",619,0.055,25,571,"Maduro Brown Ale","American Brown Ale",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Maduro Brown Ale (Cigar City Brewing Company)" +"620",620,0.05,NA,570,"Hotter Than Helles Lager","Munich Helles Lager",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Hotter Than Helles Lager (Cigar City Brewing Company)" +"621",621,0.072,75,569,"Tocobaga Red Ale","American Amber / Red Ale",141,12,"American Amber / Red Ale",142,"Cigar City Brewing Company","Tampa","FL","Tocobaga Red Ale (Cigar City Brewing Company)" +"622",622,0.075,70,546,"Jai Alai IPA","American IPA",141,12,"American IPA",142,"Cigar City Brewing Company","Tampa","FL","Jai Alai IPA (Cigar City Brewing Company)" +"623",623,0.05,18,545,"Florida Cracker Belgian Wit","Witbier",141,12,NA,142,"Cigar City Brewing Company","Tampa","FL","Florida Cracker Belgian Wit (Cigar City Brewing Company)" +"624",624,0.048,NA,2338,"Shark Tracker Light lager","Light Lager",145,12,NA,146,"Cisco Brewers","Nantucket","MA","Shark Tracker Light lager (Cisco Brewers)" +"625",625,0.06,NA,1365,"Pumple Drumkin","Pumpkin Ale",145,12,NA,146,"Cisco Brewers","Nantucket","MA","Pumple Drumkin (Cisco Brewers)" +"626",626,0.045,NA,1094,"Grey Lady","Witbier",145,12,NA,146,"Cisco Brewers","Nantucket","MA","Grey Lady (Cisco Brewers)" +"627",627,0.062,NA,657,"Summer of Lager","Munich Helles Lager",145,12,NA,146,"Cisco Brewers","Nantucket","MA","Summer of Lager (Cisco Brewers)" +"628",628,0.065,NA,656,"Indie Pale Ale","American IPA",145,12,"American IPA",146,"Cisco Brewers","Nantucket","MA","Indie Pale Ale (Cisco Brewers)" +"629",629,0.038,NA,359,"Sankaty Light Lager","Light Lager",145,12,NA,146,"Cisco Brewers","Nantucket","MA","Sankaty Light Lager (Cisco Brewers)" +"630",630,0.0559999999999999,NA,56,"Whale's Tale Pale Ale","English Pale Ale",145,12,NA,146,"Cisco Brewers","Nantucket","MA","Whale's Tale Pale Ale (Cisco Brewers)" +"631",631,0.067,60,1772,"Jacaranada Rye IPA","American IPA",320,16,"American IPA",321,"Claremont Craft Ales","Claremont","CA","Jacaranada Rye IPA (Claremont Craft Ales)" +"632",632,0.06,75,1393,"Cascadian Dark Ale","American Black Ale",418,12,NA,419,"Coalition Brewing Company","Portland","OR","Cascadian Dark Ale (Coalition Brewing Company)" +"633",633,0.044,13,893,"Wheat the People","American Pale Wheat Ale",418,16,"American Pale Wheat Ale",419,"Coalition Brewing Company","Portland","OR","Wheat the People (Coalition Brewing Company)" +"634",634,0.047,17,1407,"Tybee Island Blonde","American Blonde Ale",415,12,"American Blonde Ale",416,"Coastal Empire Beer Company","Savannah","GA","Tybee Island Blonde (Coastal Empire Beer Company)" +"635",635,0.062,55,1406,"Savannah Brown Ale","American Brown Ale",415,12,NA,416,"Coastal Empire Beer Company","Savannah","GA","Savannah Brown Ale (Coastal Empire Beer Company)" +"636",636,0.046,11,2438,"Rhode Island Blueberry","Kölsch",101,12,NA,102,"Coastal Extreme Brewing Company","Newport","RI","Rhode Island Blueberry (Coastal Extreme Brewing Company)" +"637",637,0.065,75,2437,"Newport Storm IPA","American IPA",101,12,"American IPA",102,"Coastal Extreme Brewing Company","Newport","RI","Newport Storm IPA (Coastal Extreme Brewing Company)" +"638",638,0.052,24,751,"Hurricane Amber Ale (2004)","American Amber / Red Ale",101,12,"American Amber / Red Ale",102,"Coastal Extreme Brewing Company","Newport","RI","Hurricane Amber Ale (2004) (Coastal Extreme Brewing Company)" +"639",639,0.052,24,120,"Hurricane Amber Ale","American Amber / Red Ale",101,12,"American Amber / Red Ale",102,"Coastal Extreme Brewing Company","Newport","RI","Hurricane Amber Ale (Coastal Extreme Brewing Company)" +"640",640,0.0579999999999999,NA,2061,"Big Blue Van","Fruit / Vegetable Beer",232,16,NA,233,"College Street Brewhouse and Pub","Lake Havasu City","AZ","Big Blue Van (College Street Brewhouse and Pub)" +"641",641,0.068,75,970,"Des Moines IPA","American IPA",482,16,"American IPA",483,"Confluence Brewing Company","Des Moines","IA","Des Moines IPA (Confluence Brewing Company)" +"642",642,0.048,22,969,"Capital Gold Golden Lager","German Pilsener",482,16,NA,483,"Confluence Brewing Company","Des Moines","IA","Capital Gold Golden Lager (Confluence Brewing Company)" +"643",643,0.0559999999999999,21,968,"Farmer John's Multi-Grain Ale","American Blonde Ale",482,16,"American Blonde Ale",483,"Confluence Brewing Company","Des Moines","IA","Farmer John's Multi-Grain Ale (Confluence Brewing Company)" +"644",644,0.05,NA,2351,"Behemoth","American Pilsner",139,12,NA,140,"Core Brewing & Distilling Company","Springdale","AR","Behemoth (Core Brewing & Distilling Company)" +"645",645,0.052,NA,1650,"Arkansas Red","American Amber / Red Ale",139,12,"American Amber / Red Ale",140,"Core Brewing & Distilling Company","Springdale","AR","Arkansas Red (Core Brewing & Distilling Company)" +"646",646,0.057,NA,1337,"Core Oatmeal Stout","Oatmeal Stout",139,12,NA,140,"Core Brewing & Distilling Company","Springdale","AR","Core Oatmeal Stout (Core Brewing & Distilling Company)" +"647",647,0.061,NA,1336,"Core ESB","Extra Special / Strong Bitter (ESB)",139,12,NA,140,"Core Brewing & Distilling Company","Springdale","AR","Core ESB (Core Brewing & Distilling Company)" +"648",648,0.038,NA,737,"Chester's Beer (2005)","American Pale Lager",512,12,NA,513,"Cottrell Brewing","Pawcatuck","CT","Chester's Beer (2005) (Cottrell Brewing)" +"649",649,0.05,NA,129,"Heiner Brau Kölsch","Kölsch",553,12,NA,554,"Covington Brewhouse","Covington","LA","Heiner Brau Kölsch (Covington Brewhouse)" +"650",650,0.048,NA,716,"Trigger Blonde Ale","American Blonde Ale",515,16,"American Blonde Ale",516,"Crabtree Brewing Company","Greeley","CO","Trigger Blonde Ale (Crabtree Brewing Company)" +"651",651,0.075,29,659,"Crabtree Oatmeal Stout","Oatmeal Stout",515,16,NA,516,"Crabtree Brewing Company","Greeley","CO","Crabtree Oatmeal Stout (Crabtree Brewing Company)" +"652",652,0.077,71,556,"Eclipse Black IPA","American Black Ale",515,16,NA,516,"Crabtree Brewing Company","Greeley","CO","Eclipse Black IPA (Crabtree Brewing Company)" +"653",653,0.06,46,2538,"Neomexicanus Native","American Pale Ale (APA)",63,12,"American Pale Ale (APA)",64,"Crazy Mountain Brewing Company","Edwards","CO","Neomexicanus Native (Crazy Mountain Brewing Company)" +"654",654,0.075,25,2355,"Old Soul","Belgian Strong Pale Ale",63,12,NA,64,"Crazy Mountain Brewing Company","Edwards","CO","Old Soul (Crazy Mountain Brewing Company)" +"655",655,0.059,NA,1689,"Snowcat Coffee Stout","American Stout",63,12,NA,64,"Crazy Mountain Brewing Company","Edwards","CO","Snowcat Coffee Stout (Crazy Mountain Brewing Company)" +"656",656,NA,NA,1163,"WinterWonderGrass Festival Ale","American Amber / Red Ale",63,12,"American Amber / Red Ale",64,"Crazy Mountain Brewing Company","Edwards","CO","WinterWonderGrass Festival Ale (Crazy Mountain Brewing Company)" +"657",657,NA,NA,940,"Boohai Red Ale","American Amber / Red Ale",63,12,"American Amber / Red Ale",64,"Crazy Mountain Brewing Company","Edwards","CO","Boohai Red Ale (Crazy Mountain Brewing Company)" +"658",658,0.052,15,685,"Lava Lake Wit","Witbier",63,12,NA,64,"Crazy Mountain Brewing Company","Edwards","CO","Lava Lake Wit (Crazy Mountain Brewing Company)" +"659",659,0.06,NA,613,"Mountain Livin' Pale Ale","American Pale Ale (APA)",63,12,"American Pale Ale (APA)",64,"Crazy Mountain Brewing Company","Edwards","CO","Mountain Livin' Pale Ale (Crazy Mountain Brewing Company)" +"660",660,0.052,25,356,"Crazy Mountain Amber Ale","American Amber / Red Ale",63,12,"American Amber / Red Ale",64,"Crazy Mountain Brewing Company","Edwards","CO","Crazy Mountain Amber Ale (Crazy Mountain Brewing Company)" +"661",661,0.065,65,2029,"Tropicalia","American IPA",247,12,"American IPA",248,"Creature Comforts","Athens","GA","Tropicalia (Creature Comforts)" +"662",662,0.045,NA,2028,"Athena","Berliner Weissbier",247,12,NA,248,"Creature Comforts","Athens","GA","Athena (Creature Comforts)" +"663",663,0.049,25,2293,"Aviator Raspberry Blonde","American Blonde Ale",169,12,"American Blonde Ale",170,"Crooked Fence Brewing Company","Garden City","ID","Aviator Raspberry Blonde (Crooked Fence Brewing Company)" +"664",664,0.055,NA,1105,"3 Picket Porter","American Porter",169,12,NA,170,"Crooked Fence Brewing Company","Garden City","ID","3 Picket Porter (Crooked Fence Brewing Company)" +"665",665,0.0559999999999999,NA,1104,"Rusty Nail Pale Ale","American Pale Ale (APA)",169,12,"American Pale Ale (APA)",170,"Crooked Fence Brewing Company","Garden City","ID","Rusty Nail Pale Ale (Crooked Fence Brewing Company)" +"666",666,0.065,NA,2145,"Red Water Irish Style Red","American Amber / Red Ale",212,12,"American Amber / Red Ale",213,"Crow Peak Brewing Company","Spearfish","SD","Red Water Irish Style Red (Crow Peak Brewing Company)" +"667",667,0.066,NA,1804,"Mjöllnir","Herbed / Spiced Beer",212,12,NA,213,"Crow Peak Brewing Company","Spearfish","SD","Mjöllnir (Crow Peak Brewing Company)" +"668",668,0.055,NA,1602,"Bear Butte Nut Brown Ale","American Brown Ale",212,12,NA,213,"Crow Peak Brewing Company","Spearfish","SD","Bear Butte Nut Brown Ale (Crow Peak Brewing Company)" +"669",669,0.045,NA,1301,"Easy Livin' Summer Ale","American Blonde Ale",212,12,"American Blonde Ale",213,"Crow Peak Brewing Company","Spearfish","SD","Easy Livin' Summer Ale (Crow Peak Brewing Company)" +"670",670,0.055,NA,542,"Canyon Cream Ale","Cream Ale",212,12,NA,213,"Crow Peak Brewing Company","Spearfish","SD","Canyon Cream Ale (Crow Peak Brewing Company)" +"671",671,0.069,NA,272,"Pile O'Dirt Porter","American Porter",212,12,NA,213,"Crow Peak Brewing Company","Spearfish","SD","Pile O'Dirt Porter (Crow Peak Brewing Company)" +"672",672,0.06,NA,271,"11th Hour IPA","American IPA",212,12,"American IPA",213,"Crow Peak Brewing Company","Spearfish","SD","11th Hour IPA (Crow Peak Brewing Company)" +"673",673,0.06,31,1057,"South Ridge Amber Ale","American Amber / Red Ale",472,16,"American Amber / Red Ale",473,"Crystal Springs Brewing Company","Boulder","CO","South Ridge Amber Ale (Crystal Springs Brewing Company)" +"674",674,0.052,23,681,"Summertime Ale","Kölsch",472,16,NA,473,"Crystal Springs Brewing Company","Boulder","CO","Summertime Ale (Crystal Springs Brewing Company)" +"675",675,0.049,NA,1789,"Lost River Blonde Ale","American Blonde Ale",315,16,"American Blonde Ale",316,"Cutters Brewing Company","Avon","IN","Lost River Blonde Ale (Cutters Brewing Company)" +"676",676,0.054,NA,1788,"Monon Wheat","Witbier",315,16,NA,316,"Cutters Brewing Company","Avon","IN","Monon Wheat (Cutters Brewing Company)" +"677",677,0.08,NA,1787,"Floyd's Folly","Scottish Ale",315,16,NA,316,"Cutters Brewing Company","Avon","IN","Floyd's Folly (Cutters Brewing Company)" +"678",678,0.063,NA,1786,"Half Court IPA","American IPA",315,16,"American IPA",316,"Cutters Brewing Company","Avon","IN","Half Court IPA (Cutters Brewing Company)" +"679",679,0.045,NA,1763,"Geary's Pale Ale","English Pale Ale",323,12,NA,324,"D.L. Geary Brewing Company","Portland","ME","Geary's Pale Ale (D.L. Geary Brewing Company)" +"680",680,0.06,NA,1311,"Geary's Summer Ale","Kölsch",323,12,NA,324,"D.L. Geary Brewing Company","Portland","ME","Geary's Summer Ale (D.L. Geary Brewing Company)" +"681",681,0.08,NA,2078,"Stone of Arbroath","Scotch Ale / Wee Heavy",227,12,NA,228,"DC Brau Brewing Company","Washington","DC","Stone of Arbroath (DC Brau Brewing Company)" +"682",682,0.05,15,1809,"The Tradition","American Blonde Ale",227,12,"American Blonde Ale",228,"DC Brau Brewing Company","Washington","DC","The Tradition (DC Brau Brewing Company)" +"683",683,0.053,11,1263,"El Hefe Speaks","Hefeweizen",227,12,NA,228,"DC Brau Brewing Company","Washington","DC","El Hefe Speaks (DC Brau Brewing Company)" +"684",684,0.055,NA,1092,"Penn Quarter Porter","American Porter",227,12,NA,228,"DC Brau Brewing Company","Washington","DC","Penn Quarter Porter (DC Brau Brewing Company)" +"685",685,0.092,115,851,"On the Wings of Armageddon","American Double / Imperial IPA",227,12,"American Double / Imperial IPA",228,"DC Brau Brewing Company","Washington","DC","On the Wings of Armageddon (DC Brau Brewing Company)" +"686",686,0.065,80,186,"The Corruption","American IPA",227,12,"American IPA",228,"DC Brau Brewing Company","Washington","DC","The Corruption (DC Brau Brewing Company)" +"687",687,0.07,NA,185,"The Citizen","Belgian Pale Ale",227,12,NA,228,"DC Brau Brewing Company","Washington","DC","The Citizen (DC Brau Brewing Company)" +"688",688,0.06,NA,184,"The Public","American Pale Ale (APA)",227,12,"American Pale Ale (APA)",228,"DC Brau Brewing Company","Washington","DC","The Public (DC Brau Brewing Company)" +"689",689,0.065,NA,1224,"Dank IPA","American IPA",451,16,"American IPA",452,"Dad & Dude's Breweria","Aurora","CO","Dank IPA (Dad & Dude's Breweria)" +"690",690,0.065,NA,964,"Dank IPA (2012)","American IPA",451,16,"American IPA",452,"Dad & Dude's Breweria","Aurora","CO","Dank IPA (2012) (Dad & Dude's Breweria)" +"691",691,0.072,NA,1623,"Lift Off IPA","American IPA",358,16,"American IPA",359,"Daredevil Brewing Company","Shelbyville","IN","Lift Off IPA (Daredevil Brewing Company)" +"692",692,0.055,NA,110,"BrewFarm Select Golden Lager","American Pale Lager",554,12,NA,555,"Dave's Brewfarm","Wilson","WI","BrewFarm Select Golden Lager (Dave's Brewfarm)" +"693",693,0.05,NA,1735,"Sprocket Blonde Ale (2006)","American Blonde Ale",333,12,"American Blonde Ale",334,"David's Ale Works","Diamond Springs","CA","Sprocket Blonde Ale (2006) (David's Ale Works)" +"694",694,0.05,NA,1734,"Sprocket Pale Ale (2006)","American Pale Ale (APA)",333,12,"American Pale Ale (APA)",334,"David's Ale Works","Diamond Springs","CA","Sprocket Pale Ale (2006) (David's Ale Works)" +"695",695,0.063,37,1746,"Dead Armadillo Amber Ale","American Amber / Red Ale",330,12,"American Amber / Red Ale",331,"Dead Armadillo Craft Brewing","Tulsa","OK","Dead Armadillo Amber Ale (Dead Armadillo Craft Brewing)" +"696",696,0.06,NA,2371,"Neato Bandito","Euro Pale Lager",127,12,NA,128,"Deep Ellum Brewing Company","Dallas","TX","Neato Bandito (Deep Ellum Brewing Company)" +"697",697,0.075,33,2251,"Oak Cliff Coffee Ale","American Brown Ale",127,12,NA,128,"Deep Ellum Brewing Company","Dallas","TX","Oak Cliff Coffee Ale (Deep Ellum Brewing Company)" +"698",698,0.085,100,2166,"Dream Crusher Double IPA","American Double / Imperial IPA",127,12,"American Double / Imperial IPA",128,"Deep Ellum Brewing Company","Dallas","TX","Dream Crusher Double IPA (Deep Ellum Brewing Company)" +"699",699,0.06,NA,1827,"Deep Ellum Pale Ale","American Pale Ale (APA)",127,12,"American Pale Ale (APA)",128,"Deep Ellum Brewing Company","Dallas","TX","Deep Ellum Pale Ale (Deep Ellum Brewing Company)" +"700",700,0.07,NA,1203,"Double Brown Stout","Baltic Porter",127,12,NA,128,"Deep Ellum Brewing Company","Dallas","TX","Double Brown Stout (Deep Ellum Brewing Company)" +"701",701,0.048,25,1202,"Farmhouse Wit","Saison / Farmhouse Ale",127,16,NA,128,"Deep Ellum Brewing Company","Dallas","TX","Farmhouse Wit (Deep Ellum Brewing Company)" +"702",702,0.046,NA,1161,"Rye Pils Session Lager","German Pilsener",127,12,NA,128,"Deep Ellum Brewing Company","Dallas","TX","Rye Pils Session Lager (Deep Ellum Brewing Company)" +"703",703,0.052,23,946,"Dallas Blonde","American Blonde Ale",127,12,"American Blonde Ale",128,"Deep Ellum Brewing Company","Dallas","TX","Dallas Blonde (Deep Ellum Brewing Company)" +"704",704,0.07,70,943,"Deep Ellum IPA","American IPA",127,12,"American IPA",128,"Deep Ellum Brewing Company","Dallas","TX","Deep Ellum IPA (Deep Ellum Brewing Company)" +"705",705,0.045,44,1886,"Thrasher Session India Pale Ale","American IPA",283,12,"American IPA",284,"Defiance Brewing Company","Hays","KS","Thrasher Session India Pale Ale (Defiance Brewing Company)" +"706",706,0.05,16,1885,"Gutch English Style Mild Ale","English Pale Mild Ale",283,12,NA,284,"Defiance Brewing Company","Hays","KS","Gutch English Style Mild Ale (Defiance Brewing Company)" +"707",707,0.059,55,1213,"Chuli Stout","Irish Dry Stout",453,12,NA,454,"Denali Brewing Company","Talkeetna","AK","Chuli Stout (Denali Brewing Company)" +"708",708,0.0559999999999999,46,1159,"Mother Ale","American Blonde Ale",453,12,"American Blonde Ale",454,"Denali Brewing Company","Talkeetna","AK","Mother Ale (Denali Brewing Company)" +"709",709,0.065,71,947,"Twister Creek India Pale Ale","American IPA",453,12,"American IPA",454,"Denali Brewing Company","Talkeetna","AK","Twister Creek India Pale Ale (Denali Brewing Company)" +"710",710,0.0579999999999999,46,929,"Single Engine Red","Irish Red Ale",453,12,NA,454,"Denali Brewing Company","Talkeetna","AK","Single Engine Red (Denali Brewing Company)" +"711",711,0.07,NA,1944,"Incredible Pedal IPA","American IPA",263,12,"American IPA",264,"Denver Beer Company","Denver","CO","Incredible Pedal IPA (Denver Beer Company)" +"712",712,0.05,NA,1943,"Graham Cracker Porter","American Porter",263,12,NA,264,"Denver Beer Company","Denver","CO","Graham Cracker Porter (Denver Beer Company)" +"713",713,0.05,40,1210,"Mirror Pond Pale Ale","American Pale Ale (APA)",454,12,"American Pale Ale (APA)",455,"Deschutes Brewery","Bend","OR","Mirror Pond Pale Ale (Deschutes Brewery)" +"714",714,0.052,16,2550,"Weissenheimer","Hefeweizen",57,12,NA,58,"Destihl Brewery","Bloomington","IL","Weissenheimer (Destihl Brewery)" +"715",715,0.049,22,2505,"Abbey's Single (2015- )","Abbey Single Ale",57,12,NA,58,"Destihl Brewery","Bloomington","IL","Abbey's Single (2015- ) (Destihl Brewery)" +"716",716,0.063,76,2025,"Vertex IPA","American IPA",57,12,"American IPA",58,"Destihl Brewery","Bloomington","IL","Vertex IPA (Destihl Brewery)" +"717",717,0.05,12,2021,"Here Gose Nothin'","Gose",57,12,NA,58,"Destihl Brewery","Bloomington","IL","Here Gose Nothin' (Destihl Brewery)" +"718",718,0.05,NA,2015,"Strawberry Blonde","Fruit / Vegetable Beer",57,12,NA,58,"Destihl Brewery","Bloomington","IL","Strawberry Blonde (Destihl Brewery)" +"719",719,0.096,85,1888,"Hoperation Overload","American Double / Imperial IPA",57,12,"American Double / Imperial IPA",58,"Destihl Brewery","Bloomington","IL","Hoperation Overload (Destihl Brewery)" +"720",720,0.049,22,1887,"Abbey's Single Ale (Current)","Abbey Single Ale",57,12,NA,58,"Destihl Brewery","Bloomington","IL","Abbey's Single Ale (Current) (Destihl Brewery)" +"721",721,0.044,45,2051,"Bravo Four Point","American Pale Ale (APA)",237,12,"American Pale Ale (APA)",238,"Devil's Backbone Brewing Company","Lexington","VA","Bravo Four Point (Devil's Backbone Brewing Company)" +"722",722,0.052,26,1201,"Striped Bass Pale Ale","American Pale Ale (APA)",237,12,"American Pale Ale (APA)",238,"Devil's Backbone Brewing Company","Lexington","VA","Striped Bass Pale Ale (Devil's Backbone Brewing Company)" +"723",723,0.054,27,924,"Deadicated Amber","American Amber / Red Ale",491,16,"American Amber / Red Ale",492,"Devil's Canyon Brewery","Belmont","CA","Deadicated Amber (Devil's Canyon Brewery)" +"724",724,NA,NA,731,"Kaleidoscope Collaboration 2012","American Black Ale",491,16,NA,492,"Devil's Canyon Brewery","Belmont","CA","Kaleidoscope Collaboration 2012 (Devil's Canyon Brewery)" +"725",725,0.071,85,730,"California Sunshine Rye IPA","American IPA",491,16,"American IPA",492,"Devil's Canyon Brewery","Belmont","CA","California Sunshine Rye IPA (Devil's Canyon Brewery)" +"726",726,0.074,12,647,"Full Boar Scotch Ale","Scotch Ale / Wee Heavy",491,16,NA,492,"Devil's Canyon Brewery","Belmont","CA","Full Boar Scotch Ale (Devil's Canyon Brewery)" +"727",727,0.045,NA,1773,"12 Man Pale Ale","American Pale Ale (APA)",319,12,"American Pale Ale (APA)",320,"Dick's Brewing Company","Centralia","WA","12 Man Pale Ale (Dick's Brewing Company)" +"728",728,0.065,72,1795,"Filthy Hoppin' IPA","American IPA",311,16,"American IPA",312,"Dirty Bucket Brewing Company","Woodinville","WA","Filthy Hoppin' IPA (Dirty Bucket Brewing Company)" +"729",729,NA,NA,944,"Dock Street Amber Beer (1992)","American Amber / Red Ale",488,12,"American Amber / Red Ale",489,"Dock Street Brewery","Philadelphia","PA","Dock Street Amber Beer (1992) (Dock Street Brewery)" +"730",730,NA,NA,524,"Dolores River Hefeweizen","Hefeweizen",531,16,NA,532,"Dolores River Brewery","Dolores","CO","Dolores River Hefeweizen (Dolores River Brewery)" +"731",731,NA,NA,450,"Dolores River ESB","Extra Special / Strong Bitter (ESB)",531,16,NA,532,"Dolores River Brewery","Dolores","CO","Dolores River ESB (Dolores River Brewery)" +"732",732,NA,NA,449,"Snaggletooth Double Pale Ale","American Double / Imperial IPA",531,16,"American Double / Imperial IPA",532,"Dolores River Brewery","Dolores","CO","Snaggletooth Double Pale Ale (Dolores River Brewery)" +"733",733,NA,NA,448,"Dolores River Pale Ale","American Pale Ale (APA)",531,16,"American Pale Ale (APA)",532,"Dolores River Brewery","Dolores","CO","Dolores River Pale Ale (Dolores River Brewery)" +"734",734,NA,NA,447,"Dolores River Dry Stout","Irish Dry Stout",531,16,NA,532,"Dolores River Brewery","Dolores","CO","Dolores River Dry Stout (Dolores River Brewery)" +"735",735,NA,NA,446,"Dolores River Mild","English Dark Mild Ale",531,16,NA,532,"Dolores River Brewery","Dolores","CO","Dolores River Mild (Dolores River Brewery)" +"736",736,0.049,NA,1246,"Cranberry Blend","Cider",446,12,NA,447,"Downeast Cider House","Leominster","MA","Cranberry Blend (Downeast Cider House)" +"737",737,0.051,NA,977,"Orignal Blend","Cider",446,12,NA,447,"Downeast Cider House","Leominster","MA","Orignal Blend (Downeast Cider House)" +"738",738,0.066,100,881,"Hop Abomination","American IPA",496,12,"American IPA",497,"Dry Dock Brewing Company","Aurora","CO","Hop Abomination (Dry Dock Brewing Company)" +"739",739,0.051,17,880,"Apricot Blonde","Fruit / Vegetable Beer",496,12,NA,497,"Dry Dock Brewing Company","Aurora","CO","Apricot Blonde (Dry Dock Brewing Company)" +"740",740,0.043,12,872,"Dry Dock Hefeweizen","Hefeweizen",496,12,NA,497,"Dry Dock Brewing Company","Aurora","CO","Dry Dock Hefeweizen (Dry Dock Brewing Company)" +"741",741,0.0579999999999999,49,871,"Dry Dock Amber Ale","American Amber / Red Ale",496,12,"American Amber / Red Ale",497,"Dry Dock Brewing Company","Aurora","CO","Dry Dock Amber Ale (Dry Dock Brewing Company)" +"742",742,0.061,64,1685,"Category 3 IPA","American IPA",340,12,"American IPA",341,"Due South Brewing Company","Boynton Beach","FL","Category 3 IPA (Due South Brewing Company)" +"743",743,0.045,18,457,"Dundee Summer Wheat Beer","American Pale Wheat Ale",538,12,"American Pale Wheat Ale",539,"Dundee Brewing Company","Rochester","NY","Dundee Summer Wheat Beer (Dundee Brewing Company)" +"744",744,0.05,NA,1590,"Pumpkin Patch Ale","Pumpkin Ale",369,16,NA,370,"Eddyline Brewery & Restaurant","Buena Vista","CO","Pumpkin Patch Ale (Eddyline Brewery & Restaurant)" +"745",745,0.078,74,1382,"Crank Yanker IPA","American IPA",369,16,"American IPA",370,"Eddyline Brewery & Restaurant","Buena Vista","CO","Crank Yanker IPA (Eddyline Brewery & Restaurant)" +"746",746,0.06,NA,1110,"River Runners Pale Ale","American Pale Ale (APA)",369,16,"American Pale Ale (APA)",370,"Eddyline Brewery & Restaurant","Buena Vista","CO","River Runners Pale Ale (Eddyline Brewery & Restaurant)" +"747",747,0.05,NA,1014,"Pumpkin Patch Ale (2012)","Pumpkin Ale",369,16,NA,370,"Eddyline Brewery & Restaurant","Buena Vista","CO","Pumpkin Patch Ale (2012) (Eddyline Brewery & Restaurant)" +"748",748,0.055,NA,911,"Mountain Fairy Raspberry Wheat","Fruit / Vegetable Beer",369,16,NA,370,"Eddyline Brewery & Restaurant","Buena Vista","CO","Mountain Fairy Raspberry Wheat (Eddyline Brewery & Restaurant)" +"749",749,0.045,NA,680,"Boater Beer","German Pilsener",369,16,NA,370,"Eddyline Brewery & Restaurant","Buena Vista","CO","Boater Beer (Eddyline Brewery & Restaurant)" +"750",750,0.078,74,395,"Crank Yanker IPA (2011)","American IPA",369,16,"American IPA",370,"Eddyline Brewery & Restaurant","Buena Vista","CO","Crank Yanker IPA (2011) (Eddyline Brewery & Restaurant)" +"751",751,0.057,NA,1642,"Bleeding Buckeye Red Ale","Extra Special / Strong Bitter (ESB)",352,16,NA,353,"Elevator Brewing Company","Columbus","OH","Bleeding Buckeye Red Ale (Elevator Brewing Company)" +"752",752,0.049,25,673,"Dottie Seattle Lager","American Amber / Red Lager",516,16,NA,517,"Emerald City Beer Company","Seattle","WA","Dottie Seattle Lager (Emerald City Beer Company)" +"753",753,0.07,NA,1107,"Nut Sack Imperial Brown Ale","American Brown Ale",465,12,NA,466,"Engine 15 Brewing","Jacksonville Beach","FL","Nut Sack Imperial Brown Ale (Engine 15 Brewing)" +"754",754,0.05,NA,1039,"Underachiever","American Adjunct Lager",473,16,NA,474,"Engine House 9","Tacoma","WA","Underachiever (Engine House 9)" +"755",755,0.052,NA,2477,"Lil' Brainless Raspberries","Fruit / Vegetable Beer",81,12,NA,82,"Epic Brewing","Denver","CO","Lil' Brainless Raspberries (Epic Brewing)" +"756",756,0.052,NA,2008,"Element 29","American Pale Ale (APA)",81,12,"American Pale Ale (APA)",82,"Epic Brewing","Denver","CO","Element 29 (Epic Brewing)" +"757",757,0.05,NA,2004,"Hop Syndrome","American Pale Lager",81,12,NA,82,"Epic Brewing","Denver","CO","Hop Syndrome (Epic Brewing)" +"758",758,0.062,NA,2003,"Escape to Colorado","American IPA",81,12,"American IPA",82,"Epic Brewing","Denver","CO","Escape to Colorado (Epic Brewing)" +"759",759,0.043,60,2292,"Little Sister India Style Session Ale","American IPA",170,12,"American IPA",171,"Everybody's Brewing","White Salmon","WA","Little Sister India Style Session Ale (Everybody's Brewing)" +"760",760,0.062,80,1504,"Country Boy IPA","American IPA",170,12,"American IPA",171,"Everybody's Brewing","White Salmon","WA","Country Boy IPA (Everybody's Brewing)" +"761",761,0.049,23,2604,"Blonde Czich","American Blonde Ale",26,16,"American Blonde Ale",27,"Evil Czech Brewery","Mishawaka","IN","Blonde Czich (Evil Czech Brewery)" +"762",762,0.07,61,2432,"White Reaper","Belgian IPA",26,16,NA,27,"Evil Czech Brewery","Mishawaka","IN","White Reaper (Evil Czech Brewery)" +"763",763,0.051,NA,2431,"Bobblehead","American Pale Wheat Ale",26,16,"American Pale Wheat Ale",27,"Evil Czech Brewery","Mishawaka","IN","Bobblehead (Evil Czech Brewery)" +"764",764,0.052,NA,2430,"Lucky Dog","American Pale Ale (APA)",26,16,"American Pale Ale (APA)",27,"Evil Czech Brewery","Mishawaka","IN","Lucky Dog (Evil Czech Brewery)" +"765",765,0.048,NA,2429,"Voodoo","American Porter",26,16,NA,27,"Evil Czech Brewery","Mishawaka","IN","Voodoo (Evil Czech Brewery)" +"766",766,0.054,48,1967,"General George Patton Pilsner","Czech Pilsener",26,16,NA,27,"Evil Czech Brewery","Mishawaka","IN","General George Patton Pilsner (Evil Czech Brewery)" +"767",767,0.04,NA,2283,"Nomader Weiss","Berliner Weissbier",173,12,NA,174,"Evil Twin Brewing","Brooklyn","NY","Nomader Weiss (Evil Twin Brewing)" +"768",768,0.085,NA,2248,"Molotov Lite","American Double / Imperial IPA",173,16,"American Double / Imperial IPA",174,"Evil Twin Brewing","Brooklyn","NY","Molotov Lite (Evil Twin Brewing)" +"769",769,0.055,NA,1287,"Hipster Ale (Two Roads Brewing)","American Pale Ale (APA)",173,12,"American Pale Ale (APA)",174,"Evil Twin Brewing","Brooklyn","NY","Hipster Ale (Two Roads Brewing) (Evil Twin Brewing)" +"770",770,0.027,NA,1286,"Bikini Beer","American IPA",173,12,"American IPA",174,"Evil Twin Brewing","Brooklyn","NY","Bikini Beer (Evil Twin Brewing)" +"771",771,0.055,NA,640,"Hipster Ale (Westbrook Brewing)","American Pale Ale (APA)",173,12,"American Pale Ale (APA)",174,"Evil Twin Brewing","Brooklyn","NY","Hipster Ale (Westbrook Brewing) (Evil Twin Brewing)" +"772",772,0.05,32,1722,"Iron Horse Pale Ale","American Pale Ale (APA)",335,12,"American Pale Ale (APA)",336,"Fargo Brewing Company","Fargo","ND","Iron Horse Pale Ale (Fargo Brewing Company)" +"773",773,0.045,19,1435,"Stone's Throw IPA","Scottish Ale",335,12,NA,336,"Fargo Brewing Company","Fargo","ND","Stone's Throw IPA (Fargo Brewing Company)" +"774",774,0.067,70,1434,"Wood Chipper India Pale Ale","American IPA",335,12,"American IPA",336,"Fargo Brewing Company","Fargo","ND","Wood Chipper India Pale Ale (Fargo Brewing Company)" +"775",775,0.063,55,2089,"Trail Head","American Pale Ale (APA)",224,12,"American Pale Ale (APA)",225,"Fat Head's Brewery","Middleburg Heights","OH","Trail Head (Fat Head's Brewery)" +"776",776,0.07,80,2088,"Hop Stalker Fresh Hop IPA","American IPA",224,16,"American IPA",225,"Fat Head's Brewery","Middleburg Heights","OH","Hop Stalker Fresh Hop IPA (Fat Head's Brewery)" +"777",777,0.07,58,1455,"Sudice American Stout","American Stout",405,16,NA,406,"Fate Brewing Company","Boulder","CO","Sudice American Stout (Fate Brewing Company)" +"778",778,0.05,20,1454,"Parcae Belgian Style Pale Ale","Belgian Pale Ale",405,16,NA,406,"Fate Brewing Company","Boulder","CO","Parcae Belgian Style Pale Ale (Fate Brewing Company)" +"779",779,0.05,20,1453,"Norns Roggenbier","Roggenbier",405,16,NA,406,"Fate Brewing Company","Boulder","CO","Norns Roggenbier (Fate Brewing Company)" +"780",780,0.05,20,1452,"Laimas Kölsch Style Ale","Kölsch",405,16,NA,406,"Fate Brewing Company","Boulder","CO","Laimas Kölsch Style Ale (Fate Brewing Company)" +"781",781,0.07,70,1451,"Moirai India Pale Ale","American IPA",405,16,"American IPA",406,"Fate Brewing Company","Boulder","CO","Moirai India Pale Ale (Fate Brewing Company)" +"782",782,0.075,53,2191,"Loki Red Ale","American Amber / Red Ale",201,16,"American Amber / Red Ale",202,"Fearless Brewing Company","Estacada","OR","Loki Red Ale (Fearless Brewing Company)" +"783",783,0.046,NA,1731,"Peaches & Cream","Fruit / Vegetable Beer",201,16,NA,202,"Fearless Brewing Company","Estacada","OR","Peaches & Cream (Fearless Brewing Company)" +"784",784,0.051,NA,1022,"Quaff India Style Session Ale","American IPA",201,16,"American IPA",202,"Fearless Brewing Company","Estacada","OR","Quaff India Style Session Ale (Fearless Brewing Company)" +"785",785,0.075,53,895,"Loki Red Ale (2013)","American Amber / Red Ale",201,16,"American Amber / Red Ale",202,"Fearless Brewing Company","Estacada","OR","Loki Red Ale (2013) (Fearless Brewing Company)" +"786",786,0.069,NA,682,"Mjolnir Imperial IPA","American Double / Imperial IPA",201,16,"American Double / Imperial IPA",202,"Fearless Brewing Company","Estacada","OR","Mjolnir Imperial IPA (Fearless Brewing Company)" +"787",787,0.05,NA,112,"Fearless Scottish Ale","Scottish Ale",201,16,NA,202,"Fearless Brewing Company","Estacada","OR","Fearless Scottish Ale (Fearless Brewing Company)" +"788",788,0.081,NA,2289,"Mastermind","American Double / Imperial IPA",172,12,"American Double / Imperial IPA",173,"Fiddlehead Brewing Company","Shelburne","VT","Mastermind (Fiddlehead Brewing Company)" +"789",789,0.0819999999999999,NA,2027,"Hyzer Flip","American Double / Imperial IPA",172,16,"American Double / Imperial IPA",173,"Fiddlehead Brewing Company","Shelburne","VT","Hyzer Flip (Fiddlehead Brewing Company)" +"790",790,0.0819999999999999,80,1929,"Second Fiddle","American Double / Imperial IPA",172,16,"American Double / Imperial IPA",173,"Fiddlehead Brewing Company","Shelburne","VT","Second Fiddle (Fiddlehead Brewing Company)" +"791",791,0.055,30,1858,"Hodad Porter","American Porter",172,16,NA,173,"Fiddlehead Brewing Company","Shelburne","VT","Hodad Porter (Fiddlehead Brewing Company)" +"792",792,0.045,NA,2591,"Weiss Weiss Baby","Kristalweizen",36,12,NA,37,"Figueroa Mountain Brewing Company","Buellton","CA","Weiss Weiss Baby (Figueroa Mountain Brewing Company)" +"793",793,0.055,45,2590,"Czech Yo Self","Czech Pilsener",36,12,NA,37,"Figueroa Mountain Brewing Company","Buellton","CA","Czech Yo Self (Figueroa Mountain Brewing Company)" +"794",794,0.048,20,1968,"FMB 101","Kölsch",36,12,NA,37,"Figueroa Mountain Brewing Company","Buellton","CA","FMB 101 (Figueroa Mountain Brewing Company)" +"795",795,0.09,NA,1981,"Hardcore Chimera","American Double / Imperial IPA",256,16,"American Double / Imperial IPA",257,"Finch's Beer Company","Chicago","IL","Hardcore Chimera (Finch's Beer Company)" +"796",796,0.08,80,1664,"Sobek & Set","American Black Ale",256,16,NA,257,"Finch's Beer Company","Chicago","IL","Sobek & Set (Finch's Beer Company)" +"797",797,0.086,NA,1663,"Nuclear Winter","Belgian Strong Dark Ale",256,16,NA,257,"Finch's Beer Company","Chicago","IL","Nuclear Winter (Finch's Beer Company)" +"798",798,0.05,22,1662,"Wet Hot American Wheat Ale","American Pale Wheat Ale",256,16,"American Pale Wheat Ale",257,"Finch's Beer Company","Chicago","IL","Wet Hot American Wheat Ale (Finch's Beer Company)" +"799",799,0.053,NA,941,"Secret Stache Stout","American Stout",256,16,NA,257,"Finch's Beer Company","Chicago","IL","Secret Stache Stout (Finch's Beer Company)" +"800",800,0.08,72,935,"Fascist Pig Ale","American Amber / Red Ale",256,16,"American Amber / Red Ale",257,"Finch's Beer Company","Chicago","IL","Fascist Pig Ale (Finch's Beer Company)" +"801",801,0.055,NA,809,"Cut Throat Pale Ale","American Pale Ale (APA)",256,16,"American Pale Ale (APA)",257,"Finch's Beer Company","Chicago","IL","Cut Throat Pale Ale (Finch's Beer Company)" +"802",802,0.075,NA,481,"Threadless IPA","American IPA",256,16,"American IPA",257,"Finch's Beer Company","Chicago","IL","Threadless IPA (Finch's Beer Company)" +"803",803,0.055,NA,351,"Cut Throat Pale Ale (2011)","American Pale Ale (APA)",256,16,"American Pale Ale (APA)",257,"Finch's Beer Company","Chicago","IL","Cut Throat Pale Ale (2011) (Finch's Beer Company)" +"804",804,0.047,NA,350,"Golden Wing Blonde Ale","American Blonde Ale",256,16,"American Blonde Ale",257,"Finch's Beer Company","Chicago","IL","Golden Wing Blonde Ale (Finch's Beer Company)" +"805",805,0.045,47,2569,"Easy Jack","American IPA",48,12,"American IPA",49,"Firestone Walker Brewing Company","Paso Robles","CA","Easy Jack (Firestone Walker Brewing Company)" +"806",806,0.075,75,2463,"Union Jack","American IPA",48,12,"American IPA",49,"Firestone Walker Brewing Company","Paso Robles","CA","Union Jack (Firestone Walker Brewing Company)" +"807",807,0.053,NA,2462,"Pivo Pils","German Pilsener",48,12,NA,49,"Firestone Walker Brewing Company","Paso Robles","CA","Pivo Pils (Firestone Walker Brewing Company)" +"808",808,0.047,NA,1957,"805 Blonde Ale","American Blonde Ale",48,12,"American Blonde Ale",49,"Firestone Walker Brewing Company","Paso Robles","CA","805 Blonde Ale (Firestone Walker Brewing Company)" +"809",809,0.047,20,1733,"805","American Blonde Ale",48,12,"American Blonde Ale",49,"Firestone Walker Brewing Company","Paso Robles","CA","805 (Firestone Walker Brewing Company)" +"810",810,0.065,NA,2624,"Deflator","Doppelbock",16,16,NA,17,"Flat 12 Bierwerks","Indianapolis","IN","Deflator (Flat 12 Bierwerks)" +"811",811,0.05,27,2284,"Hinchtown Hammer Down","American Blonde Ale",16,16,"American Blonde Ale",17,"Flat 12 Bierwerks","Indianapolis","IN","Hinchtown Hammer Down (Flat 12 Bierwerks)" +"812",812,0.06,104,1610,"Half Cycle IPA","American IPA",16,16,"American IPA",17,"Flat 12 Bierwerks","Indianapolis","IN","Half Cycle IPA (Flat 12 Bierwerks)" +"813",813,NA,NA,520,"Inclined Plane Ale","American IPA",532,12,"American IPA",533,"Flat Rock Brewing Company","Smithton","PA","Inclined Plane Ale (Flat Rock Brewing Company)" +"814",814,0.055,NA,2554,"Moped Traveler","American Pale Ale (APA)",54,16,"American Pale Ale (APA)",55,"Flesk Brewing Company","Lombard","IL","Moped Traveler (Flesk Brewing Company)" +"815",815,0.071,60,608,"Snake Dog IPA","American IPA",521,12,"American IPA",522,"Flying Dog Brewery","Frederick","MD","Snake Dog IPA (Flying Dog Brewery)" +"816",816,0.047,28,607,"Underdog Atlantic Lager","American Pale Lager",521,12,NA,522,"Flying Dog Brewery","Frederick","MD","Underdog Atlantic Lager (Flying Dog Brewery)" +"817",817,0.04,NA,2567,"Flying Mouse 8","American Porter",50,12,NA,51,"Flying Mouse Brewery","Troutville","VA","Flying Mouse 8 (Flying Mouse Brewery)" +"818",818,0.07,70,2566,"Flying Mouse 4","American IPA",50,12,"American IPA",51,"Flying Mouse Brewery","Troutville","VA","Flying Mouse 4 (Flying Mouse Brewery)" +"819",819,0.078,NA,1899,"La Ferme Urbaine Farmhouse Ale","Saison / Farmhouse Ale",279,12,NA,280,"Foolproof Brewing Company","Pawtucket","RI","La Ferme Urbaine Farmhouse Ale (Foolproof Brewing Company)" +"820",820,0.06,NA,983,"Backyahd IPA","American IPA",279,12,"American IPA",280,"Foolproof Brewing Company","Pawtucket","RI","Backyahd IPA (Foolproof Brewing Company)" +"821",821,0.065,NA,982,"Raincloud Robust Porter","American Porter",279,12,NA,280,"Foolproof Brewing Company","Pawtucket","RI","Raincloud Robust Porter (Foolproof Brewing Company)" +"822",822,0.045,NA,981,"Barstool American Golden Ale","American Blonde Ale",279,12,"American Blonde Ale",280,"Foolproof Brewing Company","Pawtucket","RI","Barstool American Golden Ale (Foolproof Brewing Company)" +"823",823,0.05,18,2111,"What the Butler Saw","Witbier",217,12,NA,218,"Forgotten Boardwalk","Cherry Hill","NJ","What the Butler Saw (Forgotten Boardwalk)" +"824",824,0.069,65,2110,"1916 Shore Shiver","American IPA",217,12,"American IPA",218,"Forgotten Boardwalk","Cherry Hill","NJ","1916 Shore Shiver (Forgotten Boardwalk)" +"825",825,0.052,NA,2172,"Quick WIT","Belgian Pale Ale",206,12,NA,207,"Fort George Brewery","Astoria","OR","Quick WIT (Fort George Brewery)" +"826",826,0.062,NA,2171,"The Optimist","American IPA",206,12,"American IPA",207,"Fort George Brewery","Astoria","OR","The Optimist (Fort George Brewery)" +"827",827,0.045,NA,1911,"Suicide Squeeze IPA","American IPA",206,16,"American IPA",207,"Fort George Brewery","Astoria","OR","Suicide Squeeze IPA (Fort George Brewery)" +"828",828,0.065,NA,1803,"Java the Hop","American IPA",206,16,"American IPA",207,"Fort George Brewery","Astoria","OR","Java the Hop (Fort George Brewery)" +"829",829,0.062,NA,1566,"Next Adventure Black IPA","American Black Ale",206,16,NA,207,"Fort George Brewery","Astoria","OR","Next Adventure Black IPA (Fort George Brewery)" +"830",830,0.067,NA,1515,"3-Way IPA (2013)","American IPA",206,16,"American IPA",207,"Fort George Brewery","Astoria","OR","3-Way IPA (2013) (Fort George Brewery)" +"831",831,0.0579999999999999,NA,1214,"Tender Loving Empire NWPA","American Pale Ale (APA)",206,16,"American Pale Ale (APA)",207,"Fort George Brewery","Astoria","OR","Tender Loving Empire NWPA (Fort George Brewery)" +"832",832,0.052,NA,674,"Quick Wit Belgianesque Ale","Witbier",206,16,NA,207,"Fort George Brewery","Astoria","OR","Quick Wit Belgianesque Ale (Fort George Brewery)" +"833",833,0.055,NA,562,"Sunrise Oatmeal Pale Ale","American Pale Ale (APA)",206,16,"American Pale Ale (APA)",207,"Fort George Brewery","Astoria","OR","Sunrise Oatmeal Pale Ale (Fort George Brewery)" +"834",834,0.088,NA,552,"Cavatica Stout","American Double / Imperial Stout",206,16,NA,207,"Fort George Brewery","Astoria","OR","Cavatica Stout (Fort George Brewery)" +"835",835,0.051,NA,319,"1811 Lager","American Amber / Red Lager",206,16,NA,207,"Fort George Brewery","Astoria","OR","1811 Lager (Fort George Brewery)" +"836",836,0.074,97,318,"Vortex IPA","American IPA",206,16,"American IPA",207,"Fort George Brewery","Astoria","OR","Vortex IPA (Fort George Brewery)" +"837",837,NA,NA,2322,"Fort Pitt Ale","American Amber / Red Ale",151,12,"American Amber / Red Ale",152,"Fort Pitt Brewing Company","Latrobe","PA","Fort Pitt Ale (Fort Pitt Brewing Company)" +"838",838,0.047,19,2661,"Park","American Pale Wheat Ale",4,12,"American Pale Wheat Ale",5,"Fort Point Beer Company","San Francisco","CA","Park (Fort Point Beer Company)" +"839",839,0.0559999999999999,16,2660,"Westfalia","American Amber / Red Ale",4,12,"American Amber / Red Ale",5,"Fort Point Beer Company","San Francisco","CA","Westfalia (Fort Point Beer Company)" +"840",840,0.046,17,2659,"KSA","Kölsch",4,12,NA,5,"Fort Point Beer Company","San Francisco","CA","KSA (Fort Point Beer Company)" +"841",841,0.063,42,2658,"Villager","American IPA",4,12,"American IPA",5,"Fort Point Beer Company","San Francisco","CA","Villager (Fort Point Beer Company)" +"842",842,0.085,50,2625,"Dirty Bastard","Scotch Ale / Wee Heavy",15,12,NA,16,"Founders Brewing Company","Grand Rapids","MI","Dirty Bastard (Founders Brewing Company)" +"843",843,0.072,65,1565,"Centennial IPA","American IPA",15,12,"American IPA",16,"Founders Brewing Company","Grand Rapids","MI","Centennial IPA (Founders Brewing Company)" +"844",844,0.047,42,1223,"All Day IPA","American IPA",15,12,"American IPA",16,"Founders Brewing Company","Grand Rapids","MI","All Day IPA (Founders Brewing Company)" +"845",845,0.076,73,1874,"El Chingon IPA","American IPA",287,12,"American IPA",288,"Four Corners Brewing Company","Dallas","TX","El Chingon IPA (Four Corners Brewing Company)" +"846",846,0.057,40,1873,"Block Party Robust Porter","American Porter",287,12,NA,288,"Four Corners Brewing Company","Dallas","TX","Block Party Robust Porter (Four Corners Brewing Company)" +"847",847,0.052,20,1872,"Local Buzz","American Blonde Ale",287,12,"American Blonde Ale",288,"Four Corners Brewing Company","Dallas","TX","Local Buzz (Four Corners Brewing Company)" +"848",848,0.055,NA,2613,"Feel Like Maplin' Love","Oatmeal Stout",22,16,NA,23,"Four Fathers Brewing","Valparaiso","IN","Feel Like Maplin' Love (Four Fathers Brewing)" +"849",849,0.05,NA,2612,"Father's Beer","Belgian Pale Ale",22,16,NA,23,"Four Fathers Brewing","Valparaiso","IN","Father's Beer (Four Fathers Brewing)" +"850",850,0.06,NA,2611,"The 26th","American IPA",22,16,"American IPA",23,"Four Fathers Brewing","Valparaiso","IN","The 26th (Four Fathers Brewing)" +"851",851,0.064,90,2610,"The Gadget","American IPA",22,16,"American IPA",23,"Four Fathers Brewing","Valparaiso","IN","The Gadget (Four Fathers Brewing)" +"852",852,0.04,NA,1657,"Leprechaun Lager","American Pale Lager",348,12,NA,349,"Four Horsemen Brewing Company","South Bend","IN","Leprechaun Lager (Four Horsemen Brewing Company)" +"853",853,0.052,17,2309,"Sunbru Kölsch","Kölsch",160,12,NA,161,"Four Peaks Brewing Company","Tempe","AZ","Sunbru Kölsch (Four Peaks Brewing Company)" +"854",854,0.06,21,1635,"Kilt Lifter Scottish-Style Ale",NA,160,12,NA,161,"Four Peaks Brewing Company","Tempe","AZ","Kilt Lifter Scottish-Style Ale (Four Peaks Brewing Company)" +"855",855,0.051,NA,1616,"Pumpkin Porter","American Porter",160,12,NA,161,"Four Peaks Brewing Company","Tempe","AZ","Pumpkin Porter (Four Peaks Brewing Company)" +"856",856,0.042,9,1585,"Four Peaks Peach Ale","Fruit / Vegetable Beer",160,12,NA,161,"Four Peaks Brewing Company","Tempe","AZ","Four Peaks Peach Ale (Four Peaks Brewing Company)" +"857",857,0.067,47,358,"Hop Knot IPA","American IPA",160,12,"American IPA",161,"Four Peaks Brewing Company","Tempe","AZ","Hop Knot IPA (Four Peaks Brewing Company)" +"858",858,0.06,21,179,"Kilt Lifter Scottish-Style Ale (2009)","Scottish Ale",160,12,NA,161,"Four Peaks Brewing Company","Tempe","AZ","Kilt Lifter Scottish-Style Ale (2009) (Four Peaks Brewing Company)" +"859",859,0.052,NA,178,"Sunbru Kölsch","Kölsch",160,12,NA,161,"Four Peaks Brewing Company","Tempe","AZ","Sunbru Kölsch (Four Peaks Brewing Company)" +"860",860,0.06,NA,2428,"Four String Vanilla Porter","American Porter",105,12,NA,106,"Four String Brewing Company","Columbus","OH","Four String Vanilla Porter (Four String Brewing Company)" +"861",861,0.05,28,2427,"Suncaster Summer Wheat","American Pale Wheat Ale",105,12,"American Pale Wheat Ale",106,"Four String Brewing Company","Columbus","OH","Suncaster Summer Wheat (Four String Brewing Company)" +"862",862,0.057,36,2425,"Brass Knuckle Pale Ale","American Pale Ale (APA)",105,12,"American Pale Ale (APA)",106,"Four String Brewing Company","Columbus","OH","Brass Knuckle Pale Ale (Four String Brewing Company)" +"863",863,0.07,70,2424,"Big Star White IPA","American White IPA",105,12,NA,106,"Four String Brewing Company","Columbus","OH","Big Star White IPA (Four String Brewing Company)" +"864",864,0.0559999999999999,NA,1998,"Old Detroit","American Amber / Red Ale",253,12,"American Amber / Red Ale",254,"Frankenmuth Brewery","Frankenmuth","MI","Old Detroit (Frankenmuth Brewery)" +"865",865,0.069,69,1556,"Batch 69 IPA","American IPA",253,12,"American IPA",254,"Frankenmuth Brewery","Frankenmuth","MI","Batch 69 IPA (Frankenmuth Brewery)" +"866",866,0.055,18,1208,"Twisted Helles Summer Lager","Munich Helles Lager",253,12,NA,254,"Frankenmuth Brewery","Frankenmuth","MI","Twisted Helles Summer Lager (Frankenmuth Brewery)" +"867",867,0.053,27,2527,"OktoberFiesta",NA,66,12,NA,67,"Freetail Brewing Company","San Antonio","TX","OktoberFiesta (Freetail Brewing Company)" +"868",868,0.065,33,2526,"Texicali","American Brown Ale",66,12,NA,67,"Freetail Brewing Company","San Antonio","TX","Texicali (Freetail Brewing Company)" +"869",869,0.06,NA,2525,"Pinata Protest","Witbier",66,12,NA,67,"Freetail Brewing Company","San Antonio","TX","Pinata Protest (Freetail Brewing Company)" +"870",870,0.042,20,2524,"Bat Outta Helles","Munich Helles Lager",66,12,NA,67,"Freetail Brewing Company","San Antonio","TX","Bat Outta Helles (Freetail Brewing Company)" +"871",871,0.068,NA,2523,"Original","American Amber / Red Ale",66,12,"American Amber / Red Ale",67,"Freetail Brewing Company","San Antonio","TX","Original (Freetail Brewing Company)" +"872",872,0.042,10,2522,"Rye Wit","Witbier",66,12,NA,67,"Freetail Brewing Company","San Antonio","TX","Rye Wit (Freetail Brewing Company)" +"873",873,0.059,70,2521,"Soul Doubt","American IPA",66,12,"American IPA",67,"Freetail Brewing Company","San Antonio","TX","Soul Doubt (Freetail Brewing Company)" +"874",874,0.044,5,2520,"Yo Soy Un Berliner","Berliner Weissbier",66,12,NA,67,"Freetail Brewing Company","San Antonio","TX","Yo Soy Un Berliner (Freetail Brewing Company)" +"875",875,0.04,NA,1174,"77 Fremont Select Spring Session IPA","American IPA",460,12,"American IPA",461,"Fremont Brewing Company","Seattle","WA","77 Fremont Select Spring Session IPA (Fremont Brewing Company)" +"876",876,0.045,NA,1116,"Fremont Organic Pale Ale","American Pale Ale (APA)",460,12,"American Pale Ale (APA)",461,"Fremont Brewing Company","Seattle","WA","Fremont Organic Pale Ale (Fremont Brewing Company)" +"877",877,0.08,NA,994,"Abominable Ale","English Strong Ale",460,12,NA,461,"Fremont Brewing Company","Seattle","WA","Abominable Ale (Fremont Brewing Company)" +"878",878,0.065,35,901,"Harvest Ale","Saison / Farmhouse Ale",460,12,NA,461,"Fremont Brewing Company","Seattle","WA","Harvest Ale (Fremont Brewing Company)" +"879",879,0.065,45,875,"Fremont Summer Ale","American Pale Ale (APA)",460,12,"American Pale Ale (APA)",461,"Fremont Brewing Company","Seattle","WA","Fremont Summer Ale (Fremont Brewing Company)" +"880",880,0.0559999999999999,30,858,"Universale Pale Ale","American Pale Ale (APA)",460,12,"American Pale Ale (APA)",461,"Fremont Brewing Company","Seattle","WA","Universale Pale Ale (Fremont Brewing Company)" +"881",881,0.065,80,857,"Interurban IPA","American IPA",460,12,"American IPA",461,"Fremont Brewing Company","Seattle","WA","Interurban IPA (Fremont Brewing Company)" +"882",882,0.053,32,1300,"Gateway Kolsch Style Ale","Kölsch",433,12,NA,434,"French Broad Brewery","Asheville","NC","Gateway Kolsch Style Ale (French Broad Brewery)" +"883",883,0.07,24,1260,"Wee-Heavy-Er Scotch Ale","Scotch Ale / Wee Heavy",433,12,NA,434,"French Broad Brewery","Asheville","NC","Wee-Heavy-Er Scotch Ale (French Broad Brewery)" +"884",884,0.052,42,1259,"13 Rebels ESB","Extra Special / Strong Bitter (ESB)",433,12,NA,434,"French Broad Brewery","Asheville","NC","13 Rebels ESB (French Broad Brewery)" +"885",885,0.07,73,2254,"Salamander Slam","American IPA",180,16,"American IPA",181,"Frog Level Brewing Company","Waynesville","NC","Salamander Slam (Frog Level Brewing Company)" +"886",886,0.05,NA,1658,"Cack-A-Lacky","American Pale Ale (APA)",347,12,"American Pale Ale (APA)",348,"Fullsteam Brewery","Durham","NC","Cack-A-Lacky (Fullsteam Brewery)" +"887",887,0.072,50,2077,"No Wake IPA","American IPA",228,12,"American IPA",229,"Geneva Lake Brewing Company","Lake Geneva","WI","No Wake IPA (Geneva Lake Brewing Company)" +"888",888,0.049,15,2076,"Boathouse Blonde","American Blonde Ale",228,12,"American Blonde Ale",229,"Geneva Lake Brewing Company","Lake Geneva","WI","Boathouse Blonde (Geneva Lake Brewing Company)" +"889",889,0.05,26,2075,"Cedar Point","American Amber / Red Ale",228,12,"American Amber / Red Ale",229,"Geneva Lake Brewing Company","Lake Geneva","WI","Cedar Point (Geneva Lake Brewing Company)" +"890",890,0.067,70,2426,"Clean Shave IPA","American IPA",106,12,"American IPA",107,"Glabrous Brewing Company","Pineland","ME","Clean Shave IPA (Glabrous Brewing Company)" +"891",891,0.072,75,2045,"Might As Well IPL","American Pale Lager",240,16,NA,241,"Golden Road Brewing","Los Angeles","CA","Might As Well IPL (Golden Road Brewing)" +"892",892,0.0579999999999999,35,1960,"Saison Pamplemousse","Saison / Farmhouse Ale",240,12,NA,241,"Golden Road Brewing","Los Angeles","CA","Saison Pamplemousse (Golden Road Brewing)" +"893",893,0.074,74,1777,"2020 IPA","American IPA",240,16,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","2020 IPA (Golden Road Brewing)" +"894",894,0.08,70,1698,"Wolf Among Weeds IPA","American IPA",240,16,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","Wolf Among Weeds IPA (Golden Road Brewing)" +"895",895,0.094,92,1641,"Better Weather IPA","American IPA",240,16,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","Better Weather IPA (Golden Road Brewing)" +"896",896,0.059,60,1490,"Point the Way IPA","American IPA",240,16,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","Point the Way IPA (Golden Road Brewing)" +"897",897,0.046,15,1489,"Golden Road Hefeweizen","Hefeweizen",240,16,NA,241,"Golden Road Brewing","Los Angeles","CA","Golden Road Hefeweizen (Golden Road Brewing)" +"898",898,0.068,65,1399,"Heal the Bay IPA","American IPA",240,16,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","Heal the Bay IPA (Golden Road Brewing)" +"899",899,0.059,60,1296,"Point the Way IPA","American IPA",240,12,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","Point the Way IPA (Golden Road Brewing)" +"900",900,0.05,NA,1034,"Cabrillo Kölsch","Kölsch",240,16,NA,241,"Golden Road Brewing","Los Angeles","CA","Cabrillo Kölsch (Golden Road Brewing)" +"901",901,0.055,20,991,"Get Up Offa That Brown","American Brown Ale",240,16,NA,241,"Golden Road Brewing","Los Angeles","CA","Get Up Offa That Brown (Golden Road Brewing)" +"902",902,0.08,70,750,"Burning Bush Smoked IPA","American IPA",240,16,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","Burning Bush Smoked IPA (Golden Road Brewing)" +"903",903,0.08,70,749,"Wolf Among Weeds IPA (2012)","American IPA",240,16,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","Wolf Among Weeds IPA (2012) (Golden Road Brewing)" +"904",904,0.059,60,549,"Point the Way IPA (2012)","American IPA",240,16,"American IPA",241,"Golden Road Brewing","Los Angeles","CA","Point the Way IPA (2012) (Golden Road Brewing)" +"905",905,0.046,15,548,"Golden Road Hefeweizen (2012)","Hefeweizen",240,16,NA,241,"Golden Road Brewing","Los Angeles","CA","Golden Road Hefeweizen (2012) (Golden Road Brewing)" +"906",906,0.07,11,2587,"Vanilla Porter","American Porter",39,16,NA,40,"Gonzo's BiggDogg Brewing","Kalamazoo","MI","Vanilla Porter (Gonzo's BiggDogg Brewing)" +"907",907,0.07,70,1109,"Descender IPA","American IPA",464,12,"American IPA",465,"Good Life Brewing Company","Bend","OR","Descender IPA (Good Life Brewing Company)" +"908",908,0.06,18,1108,"Sweet As Pacific Ale","American Pale Wheat Ale",464,12,"American Pale Wheat Ale",465,"Good Life Brewing Company","Bend","OR","Sweet As Pacific Ale (Good Life Brewing Company)" +"909",909,0.0559999999999999,36,1000,"Good People Pale Ale","American Pale Ale (APA)",478,12,"American Pale Ale (APA)",479,"Good People Brewing Company","Birmingham","AL","Good People Pale Ale (Good People Brewing Company)" +"910",910,0.093,103,312,"Snake Handler Double IPA","American Double / Imperial IPA",478,12,"American Double / Imperial IPA",479,"Good People Brewing Company","Birmingham","AL","Snake Handler Double IPA (Good People Brewing Company)" +"911",911,0.06,54,311,"Coffee Oatmeal Stout","Oatmeal Stout",478,12,NA,479,"Good People Brewing Company","Birmingham","AL","Coffee Oatmeal Stout (Good People Brewing Company)" +"912",912,0.06,64,309,"Good People IPA","American IPA",478,12,"American IPA",479,"Good People Brewing Company","Birmingham","AL","Good People IPA (Good People Brewing Company)" +"913",913,0.0579999999999999,36,308,"Good People American Brown Ale","American Brown Ale",478,12,NA,479,"Good People Brewing Company","Birmingham","AL","Good People American Brown Ale (Good People Brewing Company)" +"914",914,0.055,40,2205,"Mountain Rescue Pale Ale","American Pale Ale (APA)",194,12,"American Pale Ale (APA)",195,"Goodlife Brewing Co.","Bend","OR","Mountain Rescue Pale Ale (Goodlife Brewing Co.)" +"915",915,0.059,55,2198,"Goose Island India Pale Ale","American IPA",196,12,"American IPA",197,"Goose Island Brewery Company","Chicago","IL","Goose Island India Pale Ale (Goose Island Brewery Company)" +"916",916,0.054,30,2457,"312 Urban Pale Ale","American Pale Ale (APA)",88,16,"American Pale Ale (APA)",89,"Goose Island Brewing Company","Chicago","IL","312 Urban Pale Ale (Goose Island Brewing Company)" +"917",917,0.054,30,2202,"312 Urban Pale Ale","American Pale Ale (APA)",88,12,"American Pale Ale (APA)",89,"Goose Island Brewing Company","Chicago","IL","312 Urban Pale Ale (Goose Island Brewing Company)" +"918",918,0.042,18,2201,"312 Urban Wheat Ale","American Pale Wheat Ale",88,16,"American Pale Wheat Ale",89,"Goose Island Brewing Company","Chicago","IL","312 Urban Wheat Ale (Goose Island Brewing Company)" +"919",919,0.042,18,1829,"312 Urban Wheat Ale","American Pale Wheat Ale",88,12,"American Pale Wheat Ale",89,"Goose Island Brewing Company","Chicago","IL","312 Urban Wheat Ale (Goose Island Brewing Company)" +"920",920,0.042,20,581,"312 Urban Wheat Ale (2012)","American Pale Wheat Ale",88,12,"American Pale Wheat Ale",89,"Goose Island Brewing Company","Chicago","IL","312 Urban Wheat Ale (2012) (Goose Island Brewing Company)" +"921",921,0.052,19,1383,"Beaver Logger","American Pale Lager",420,12,NA,421,"Gore Range Brewery","Edwards","CO","Beaver Logger (Gore Range Brewery)" +"922",922,0.05,NA,477,"White Water Wheat","American Pale Wheat Ale",536,12,"American Pale Wheat Ale",537,"Grand Canyon Brewing Company","Williams","AZ","White Water Wheat (Grand Canyon Brewing Company)" +"923",923,0.052,NA,476,"Grand Canyon American Pilsner","American Pilsner",536,12,NA,537,"Grand Canyon Brewing Company","Williams","AZ","Grand Canyon American Pilsner (Grand Canyon Brewing Company)" +"924",924,0.054,NA,143,"Grand Canyon Sunset Amber Ale","American Amber / Red Ale",536,12,"American Amber / Red Ale",537,"Grand Canyon Brewing Company","Williams","AZ","Grand Canyon Sunset Amber Ale (Grand Canyon Brewing Company)" +"925",925,NA,NA,142,"Black Iron India Pale Ale","American IPA",536,12,"American IPA",537,"Grand Canyon Brewing Company","Williams","AZ","Black Iron India Pale Ale (Grand Canyon Brewing Company)" +"926",926,0.043,21,2129,"Monarch Classic American Wheat","American Pale Wheat Ale",213,12,"American Pale Wheat Ale",214,"Grapevine Craft Brewery","Farmers Branch","TX","Monarch Classic American Wheat (Grapevine Craft Brewery)" +"927",927,0.049,21,2127,"Sir William's English Brown Ale","English Brown Ale",213,12,NA,214,"Grapevine Craft Brewery","Farmers Branch","TX","Sir William's English Brown Ale (Grapevine Craft Brewery)" +"928",928,0.055,35,2126,"Lakefire Rye Pale Ale","American Pale Ale (APA)",213,12,"American Pale Ale (APA)",214,"Grapevine Craft Brewery","Farmers Branch","TX","Lakefire Rye Pale Ale (Grapevine Craft Brewery)" +"929",929,0.053,22,2303,"Beer Agent Re-Ignition","American Blonde Ale",165,16,"American Blonde Ale",166,"Great Crescent Brewery","Aurora","IN","Beer Agent Re-Ignition (Great Crescent Brewery)" +"930",930,0.057,18,1990,"Cherry Ale","Fruit / Vegetable Beer",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Cherry Ale (Great Crescent Brewery)" +"931",931,0.0559999999999999,33,1702,"Bourbon Barrel Aged Coconut Porter","American Porter",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Bourbon Barrel Aged Coconut Porter (Great Crescent Brewery)" +"932",932,0.062,60,1701,"Great Crescent IPA","American IPA",165,16,"American IPA",166,"Great Crescent Brewery","Aurora","IN","Great Crescent IPA (Great Crescent Brewery)" +"933",933,0.057,27,1700,"Aurora Lager","Dortmunder / Export Lager",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Aurora Lager (Great Crescent Brewery)" +"934",934,0.053,22,1699,"Great Crescent Blonde Ale","American Blonde Ale",165,16,"American Blonde Ale",166,"Great Crescent Brewery","Aurora","IN","Great Crescent Blonde Ale (Great Crescent Brewery)" +"935",935,0.0559999999999999,33,1269,"Great Crescent Coconut Porter","American Porter",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Great Crescent Coconut Porter (Great Crescent Brewery)" +"936",936,0.057,25,930,"Great Crescent Oktoberfest Lager","Märzen / Oktoberfest",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Great Crescent Oktoberfest Lager (Great Crescent Brewery)" +"937",937,0.045,36,649,"Great Crescent Brown Ale","American Brown Ale",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Great Crescent Brown Ale (Great Crescent Brewery)" +"938",938,0.057,18,639,"Cherry Ale (1)","Fruit / Vegetable Beer",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Cherry Ale (1) (Great Crescent Brewery)" +"939",939,0.057,27,626,"Aurora Lager (2011)","Dortmunder / Export Lager",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Aurora Lager (2011) (Great Crescent Brewery)" +"940",940,0.06,25,615,"Frosted Fields Winter Wheat","American Dark Wheat Ale",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Frosted Fields Winter Wheat (Great Crescent Brewery)" +"941",941,0.051,13,478,"Great Crescent Belgian Style Wit","Witbier",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Great Crescent Belgian Style Wit (Great Crescent Brewery)" +"942",942,0.075,65,455,"Bourbon's Barrel Stout","American Stout",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Bourbon's Barrel Stout (Great Crescent Brewery)" +"943",943,0.08,66,442,"Great Crescent Stout","English Stout",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Great Crescent Stout (Great Crescent Brewery)" +"944",944,0.0559999999999999,33,441,"Great Crescent Coconut Porter (2012)","American Porter",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Great Crescent Coconut Porter (2012) (Great Crescent Brewery)" +"945",945,0.057,23,440,"Great Crescent Dark Lager","Euro Dark Lager",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Great Crescent Dark Lager (Great Crescent Brewery)" +"946",946,0.042,26,439,"Great Crescent Mild Ale","English Dark Mild Ale",165,16,NA,166,"Great Crescent Brewery","Aurora","IN","Great Crescent Mild Ale (Great Crescent Brewery)" +"947",947,0.062,60,436,"Great Crescent IPA (2011)","American IPA",165,16,"American IPA",166,"Great Crescent Brewery","Aurora","IN","Great Crescent IPA (2011) (Great Crescent Brewery)" +"948",948,0.053,22,389,"Great Crescent Blonde Ale (2011)","American Blonde Ale",165,16,"American Blonde Ale",166,"Great Crescent Brewery","Aurora","IN","Great Crescent Blonde Ale (2011) (Great Crescent Brewery)" +"949",949,0.05,NA,2650,"Denver Pale Ale (Artist Series No. 1)","American Pale Ale (APA)",6,12,"American Pale Ale (APA)",7,"Great Divide Brewing Company","Denver","CO","Denver Pale Ale (Artist Series No. 1) (Great Divide Brewing Company)" +"950",950,0.087,NA,2649,"Hibernation Ale","Old Ale",6,12,NA,7,"Great Divide Brewing Company","Denver","CO","Hibernation Ale (Great Divide Brewing Company)" +"951",951,0.061,NA,2648,"Whitewater","American Pale Wheat Ale",6,12,"American Pale Wheat Ale",7,"Great Divide Brewing Company","Denver","CO","Whitewater (Great Divide Brewing Company)" +"952",952,0.071,NA,2647,"Rumble","American IPA",6,12,"American IPA",7,"Great Divide Brewing Company","Denver","CO","Rumble (Great Divide Brewing Company)" +"953",953,0.083,NA,2646,"Orabelle","Tripel",6,12,NA,7,"Great Divide Brewing Company","Denver","CO","Orabelle (Great Divide Brewing Company)" +"954",954,0.05,NA,2645,"Lasso","American IPA",6,12,"American IPA",7,"Great Divide Brewing Company","Denver","CO","Lasso (Great Divide Brewing Company)" +"955",955,0.095,75,2644,"Yeti Imperial Stout","Russian Imperial Stout",6,12,NA,7,"Great Divide Brewing Company","Denver","CO","Yeti Imperial Stout (Great Divide Brewing Company)" +"956",956,0.073,NA,2643,"Colette","Saison / Farmhouse Ale",6,12,NA,7,"Great Divide Brewing Company","Denver","CO","Colette (Great Divide Brewing Company)" +"957",957,0.071,NA,2642,"Titan IPA","American IPA",6,12,"American IPA",7,"Great Divide Brewing Company","Denver","CO","Titan IPA (Great Divide Brewing Company)" +"958",958,0.045,15,404,"Black Star Double Hopped Golden Lager (24 oz.)","American Pale Lager",543,24,NA,544,"Great Northern Brewing Company","Whitefish","MT","Black Star Double Hopped Golden Lager (24 oz.) (Great Northern Brewing Company)" +"959",959,0.045,15,164,"Black Star Double Hopped Golden Lager (12 oz.)","American Pale Lager",543,12,NA,544,"Great Northern Brewing Company","Whitefish","MT","Black Star Double Hopped Golden Lager (12 oz.) (Great Northern Brewing Company)" +"960",960,0.052,49,1923,"Commotion APA","American Pale Ale (APA)",269,12,"American Pale Ale (APA)",270,"Great Raft Brewing Company","Shreveport","LA","Commotion APA (Great Raft Brewing Company)" +"961",961,0.052,NA,1922,"Southern Drawl Pale Lager","American Pale Lager",269,12,NA,270,"Great Raft Brewing Company","Shreveport","LA","Southern Drawl Pale Lager (Great Raft Brewing Company)" +"962",962,0.05,5,1604,"Chickawawa Lemonale","Fruit / Vegetable Beer",365,12,NA,366,"Great River Brewery","Davenport","IA","Chickawawa Lemonale (Great River Brewery)" +"963",963,0.07,22,1574,"Barrel Aged Farmer","American Brown Ale",365,16,NA,366,"Great River Brewery","Davenport","IA","Barrel Aged Farmer (Great River Brewery)" +"964",964,0.048,NA,1446,"Great River Golden Ale","American Blonde Ale",365,12,"American Blonde Ale",366,"Great River Brewery","Davenport","IA","Great River Golden Ale (Great River Brewery)" +"965",965,0.048,NA,1275,"Dirty Blonde Chocolate Ale","American Blonde Ale",365,12,"American Blonde Ale",366,"Great River Brewery","Davenport","IA","Dirty Blonde Chocolate Ale (Great River Brewery)" +"966",966,0.048,20,1244,"Dos Pistolas","Vienna Lager",365,12,NA,366,"Great River Brewery","Davenport","IA","Dos Pistolas (Great River Brewery)" +"967",967,0.05,30,1064,"Owney Irish Style Red Ale","Irish Red Ale",365,16,NA,366,"Great River Brewery","Davenport","IA","Owney Irish Style Red Ale (Great River Brewery)" +"968",968,0.06,NA,1028,"Aaah Bock Lager","Vienna Lager",365,16,NA,366,"Great River Brewery","Davenport","IA","Aaah Bock Lager (Great River Brewery)" +"969",969,0.055,10,865,"Widespread Wit","Witbier",365,16,NA,366,"Great River Brewery","Davenport","IA","Widespread Wit (Great River Brewery)" +"970",970,0.054,30,864,"Roller Dam Red Ale","Irish Red Ale",365,16,NA,366,"Great River Brewery","Davenport","IA","Roller Dam Red Ale (Great River Brewery)" +"971",971,0.053,48,863,"483 Pale Ale","American Pale Ale (APA)",365,16,"American Pale Ale (APA)",366,"Great River Brewery","Davenport","IA","483 Pale Ale (Great River Brewery)" +"972",972,0.09,99,672,"Hop A Potamus Double Dark Rye Pale Ale","Rye Beer",365,16,NA,366,"Great River Brewery","Davenport","IA","Hop A Potamus Double Dark Rye Pale Ale (Great River Brewery)" +"973",973,0.07,22,655,"Farmer Brown Ale","American Brown Ale",365,16,NA,366,"Great River Brewery","Davenport","IA","Farmer Brown Ale (Great River Brewery)" +"974",974,0.07,70,540,"Big Cock IPA","American IPA",365,16,"American IPA",366,"Great River Brewery","Davenport","IA","Big Cock IPA (Great River Brewery)" +"975",975,0.059,25,539,"Oktoberfest","Märzen / Oktoberfest",365,16,NA,366,"Great River Brewery","Davenport","IA","Oktoberfest (Great River Brewery)" +"976",976,0.048,25,517,"40th Annual Bix Street Fest Copper Ale (Current)","American Amber / Red Ale",365,16,"American Amber / Red Ale",366,"Great River Brewery","Davenport","IA","40th Annual Bix Street Fest Copper Ale (Current) (Great River Brewery)" +"977",977,0.06,36,371,"Redband Stout","American Stout",365,16,NA,366,"Great River Brewery","Davenport","IA","Redband Stout (Great River Brewery)" +"978",978,0.053,48,190,"483 Pale Ale (2010)","American Pale Ale (APA)",365,16,"American Pale Ale (APA)",366,"Great River Brewery","Davenport","IA","483 Pale Ale (2010) (Great River Brewery)" +"979",979,0.054,30,189,"Roller Dam Red Ale (2010)","Irish Red Ale",365,16,NA,366,"Great River Brewery","Davenport","IA","Roller Dam Red Ale (2010) (Great River Brewery)" +"980",980,0.05,30,1106,"Pablo Beach Pale Ale","American Pale Ale (APA)",466,12,"American Pale Ale (APA)",467,"Green Room Brewing","Jacksonville","FL","Pablo Beach Pale Ale (Green Room Brewing)" +"981",981,0.057,44,2314,"Wild Trail Pale Ale","American Pale Ale (APA)",156,12,"American Pale Ale (APA)",157,"Greenbrier Valley Brewing Company","Lewisburg","WV","Wild Trail Pale Ale (Greenbrier Valley Brewing Company)" +"982",982,0.067,71,2313,"Mothman Black IPA","American Black Ale",156,12,NA,157,"Greenbrier Valley Brewing Company","Lewisburg","WV","Mothman Black IPA (Greenbrier Valley Brewing Company)" +"983",983,0.0579999999999999,NA,2461,"Autumn Winds Fest Beer","Märzen / Oktoberfest",86,16,NA,87,"Grey Sail Brewing Company","Westerly","RI","Autumn Winds Fest Beer (Grey Sail Brewing Company)" +"984",984,0.085,69,2044,"Captain's Daughter","American Double / Imperial IPA",86,12,"American Double / Imperial IPA",87,"Grey Sail Brewing Company","Westerly","RI","Captain's Daughter (Grey Sail Brewing Company)" +"985",985,0.0579999999999999,NA,1567,"Autumn Winds","Märzen / Oktoberfest",379,16,NA,380,"Grey Sail Brewing of Rhode Island","Westerly","RI","Autumn Winds (Grey Sail Brewing of Rhode Island)" +"986",986,0.06,54,1505,"Flying Jenny Extra Pale Ale","American Pale Ale (APA)",379,12,"American Pale Ale (APA)",380,"Grey Sail Brewing of Rhode Island","Westerly","RI","Flying Jenny Extra Pale Ale (Grey Sail Brewing of Rhode Island)" +"987",987,0.04,20,1186,"Hazy Day Belgian-Style Wit","Witbier",379,16,NA,380,"Grey Sail Brewing of Rhode Island","Westerly","RI","Hazy Day Belgian-Style Wit (Grey Sail Brewing of Rhode Island)" +"988",988,0.055,NA,1185,"Bring Back the Beach Blonde Ale","American Blonde Ale",379,16,"American Blonde Ale",380,"Grey Sail Brewing of Rhode Island","Westerly","RI","Bring Back the Beach Blonde Ale (Grey Sail Brewing of Rhode Island)" +"989",989,0.06,34,984,"Leaning Chimney Smoked Porter","American Porter",379,16,NA,380,"Grey Sail Brewing of Rhode Island","Westerly","RI","Leaning Chimney Smoked Porter (Grey Sail Brewing of Rhode Island)" +"990",990,0.06,54,693,"Flying Jenny Extra Pale Ale (2012)","American Pale Ale (APA)",379,12,"American Pale Ale (APA)",380,"Grey Sail Brewing of Rhode Island","Westerly","RI","Flying Jenny Extra Pale Ale (2012) (Grey Sail Brewing of Rhode Island)" +"991",991,0.049,22,631,"Flagship Ale","Cream Ale",379,12,NA,380,"Grey Sail Brewing of Rhode Island","Westerly","RI","Flagship Ale (Grey Sail Brewing of Rhode Island)" +"992",992,0.045,6,2375,"Mr. Blue Sky","American Pale Wheat Ale",124,16,"American Pale Wheat Ale",125,"Griffin Claw Brewing Company","Birmingham","MI","Mr. Blue Sky (Griffin Claw Brewing Company)" +"993",993,0.065,NA,2143,"3 Scrooges","Winter Warmer",124,16,NA,125,"Griffin Claw Brewing Company","Birmingham","MI","3 Scrooges (Griffin Claw Brewing Company)" +"994",994,0.05,25,2142,"Screamin’ Pumpkin","Pumpkin Ale",124,16,NA,125,"Griffin Claw Brewing Company","Birmingham","MI","Screamin’ Pumpkin (Griffin Claw Brewing Company)" +"995",995,0.05,35,2141,"Grand Trunk Bohemian Pils","Czech Pilsener",124,16,NA,125,"Griffin Claw Brewing Company","Birmingham","MI","Grand Trunk Bohemian Pils (Griffin Claw Brewing Company)" +"996",996,0.065,25,2140,"El Rojo","American Amber / Red Ale",124,16,"American Amber / Red Ale",125,"Griffin Claw Brewing Company","Birmingham","MI","El Rojo (Griffin Claw Brewing Company)" +"997",997,0.075,NA,2139,"Norm's Raggedy Ass IPA","American IPA",124,16,"American IPA",125,"Griffin Claw Brewing Company","Birmingham","MI","Norm's Raggedy Ass IPA (Griffin Claw Brewing Company)" +"998",998,0.05,35,2138,"Grind Line","American Pale Ale (APA)",124,16,"American Pale Ale (APA)",125,"Griffin Claw Brewing Company","Birmingham","MI","Grind Line (Griffin Claw Brewing Company)" +"999",999,0.04,55,2007,"Norm's Gateway IPA","American IPA",124,12,"American IPA",125,"Griffin Claw Brewing Company","Birmingham","MI","Norm's Gateway IPA (Griffin Claw Brewing Company)" +"1000",1000,0.09,NA,1570,"Lemon Shandy Tripel","Tripel",124,16,NA,125,"Griffin Claw Brewing Company","Birmingham","MI","Lemon Shandy Tripel (Griffin Claw Brewing Company)" +"1001",1001,0.063,43,2339,"Little Red Cap","Altbier",144,12,NA,145,"Grimm Brothers Brewhouse","Loveland","CO","Little Red Cap (Grimm Brothers Brewhouse)" +"1002",1002,0.069,67,1857,"Supergoose IPA","American IPA",290,12,"American IPA",291,"Hale's Ales","Seattle","WA","Supergoose IPA (Hale's Ales)" +"1003",1003,0.047,NA,1440,"Hale's Pale American Ale","American Pale Ale (APA)",290,12,"American Pale Ale (APA)",291,"Hale's Ales","Seattle","WA","Hale's Pale American Ale (Hale's Ales)" +"1004",1004,0.07,NA,1753,"Heyoka IPA","American IPA",327,16,"American IPA",328,"Half Acre Beer Company","Chicago","IL","Heyoka IPA (Half Acre Beer Company)" +"1005",1005,0.08,NA,1448,"Guest Lager","American Double / Imperial Pilsner",327,16,NA,328,"Half Acre Beer Company","Chicago","IL","Guest Lager (Half Acre Beer Company)" +"1006",1006,0.057,NA,1134,"Pony Pilsner","German Pilsener",327,16,NA,328,"Half Acre Beer Company","Chicago","IL","Pony Pilsner (Half Acre Beer Company)" +"1007",1007,0.055,NA,1066,"Akari Shogun American Wheat Ale","American Pale Wheat Ale",327,16,"American Pale Wheat Ale",328,"Half Acre Beer Company","Chicago","IL","Akari Shogun American Wheat Ale (Half Acre Beer Company)" +"1008",1008,0.06,NA,849,"Meat Wave","English India Pale Ale (IPA)",327,16,NA,328,"Half Acre Beer Company","Chicago","IL","Meat Wave (Half Acre Beer Company)" +"1009",1009,0.06,NA,352,"Over Ale","American Brown Ale",327,16,NA,328,"Half Acre Beer Company","Chicago","IL","Over Ale (Half Acre Beer Company)" +"1010",1010,0.042,NA,149,"Gossamer Golden Ale","American Blonde Ale",327,16,"American Blonde Ale",328,"Half Acre Beer Company","Chicago","IL","Gossamer Golden Ale (Half Acre Beer Company)" +"1011",1011,0.052,NA,148,"Daisy Cutter Pale Ale","American Pale Ale (APA)",327,16,"American Pale Ale (APA)",328,"Half Acre Beer Company","Chicago","IL","Daisy Cutter Pale Ale (Half Acre Beer Company)" +"1012",1012,0.07,40,2026,"Pursuit","American IPA",248,12,"American IPA",249,"Half Full Brewery","Stamford","CT","Pursuit (Half Full Brewery)" +"1013",1013,0.052,18,1361,"Half Full Bright Ale","American Blonde Ale",248,12,"American Blonde Ale",249,"Half Full Brewery","Stamford","CT","Half Full Bright Ale (Half Full Brewery)" +"1014",1014,0.046,17,1016,"Orange Wheat","Fruit / Vegetable Beer",476,12,NA,477,"Hangar 24 Craft Brewery","Redlands","CA","Orange Wheat (Hangar 24 Craft Brewery)" +"1015",1015,0.043,14,1015,"Hangar 24 Helles Lager","Munich Helles Lager",476,12,NA,477,"Hangar 24 Craft Brewery","Redlands","CA","Hangar 24 Helles Lager (Hangar 24 Craft Brewery)" +"1016",1016,0.075,70,1677,"The Great Return","American IPA",343,16,"American IPA",344,"Hardywood Park Craft Brewery","Richmond","VA","The Great Return (Hardywood Park Craft Brewery)" +"1017",1017,0.044,18,1331,"Hardywood Cream Ale","Cream Ale",343,12,NA,344,"Hardywood Park Craft Brewery","Richmond","VA","Hardywood Cream Ale (Hardywood Park Craft Brewery)" +"1018",1018,0.0559999999999999,55,1270,"Capital Trail Pale Ale","American Pale Ale (APA)",343,12,"American Pale Ale (APA)",344,"Hardywood Park Craft Brewery","Richmond","VA","Capital Trail Pale Ale (Hardywood Park Craft Brewery)" +"1019",1019,0.052,15,2059,"UFO Gingerland","Herbed / Spiced Beer",234,12,NA,235,"Harpoon Brewery","Boston","MA","UFO Gingerland (Harpoon Brewery)" +"1020",1020,0.062,45,1653,"The Long Thaw White IPA","American White IPA",234,12,NA,235,"Harpoon Brewery","Boston","MA","The Long Thaw White IPA (Harpoon Brewery)" +"1021",1021,0.048,NA,1558,"Honey Cider","Cider",234,12,NA,235,"Harpoon Brewery","Boston","MA","Honey Cider (Harpoon Brewery)" +"1022",1022,0.05,28,1380,"Harpoon Summer Beer","Kölsch",234,12,NA,235,"Harpoon Brewery","Boston","MA","Harpoon Summer Beer (Harpoon Brewery)" +"1023",1023,0.059,42,1379,"Harpoon IPA","American IPA",234,12,"American IPA",235,"Harpoon Brewery","Boston","MA","Harpoon IPA (Harpoon Brewery)" +"1024",1024,0.059,20,1340,"UFO Pumpkin","Pumpkin Ale",234,12,NA,235,"Harpoon Brewery","Boston","MA","UFO Pumpkin (Harpoon Brewery)" +"1025",1025,0.055,30,1313,"Harpoon Octoberfest","Märzen / Oktoberfest",234,12,NA,235,"Harpoon Brewery","Boston","MA","Harpoon Octoberfest (Harpoon Brewery)" +"1026",1026,0.059,42,770,"Harpoon IPA (2012)","American IPA",234,12,"American IPA",235,"Harpoon Brewery","Boston","MA","Harpoon IPA (2012) (Harpoon Brewery)" +"1027",1027,0.05,28,769,"Harpoon Summer Beer (2012)","Kölsch",234,12,NA,235,"Harpoon Brewery","Boston","MA","Harpoon Summer Beer (2012) (Harpoon Brewery)" +"1028",1028,0.048,10,610,"UFO White","American Pale Wheat Ale",234,12,"American Pale Wheat Ale",235,"Harpoon Brewery","Boston","MA","UFO White (Harpoon Brewery)" +"1029",1029,0.05,28,192,"Harpoon Summer Beer (2010)","Kölsch",234,12,NA,235,"Harpoon Brewery","Boston","MA","Harpoon Summer Beer (2010) (Harpoon Brewery)" +"1030",1030,0.059,42,126,"Harpoon IPA (2010)","American IPA",234,12,"American IPA",235,"Harpoon Brewery","Boston","MA","Harpoon IPA (2010) (Harpoon Brewery)" +"1031",1031,NA,NA,506,"Great Falls Select Pale Ale","American Blonde Ale",535,12,"American Blonde Ale",536,"Harvest Moon Brewing Company","Belt","MT","Great Falls Select Pale Ale (Harvest Moon Brewing Company)" +"1032",1032,0.048,NA,181,"Beltian White","Witbier",535,12,NA,536,"Harvest Moon Brewing Company","Belt","MT","Beltian White (Harvest Moon Brewing Company)" +"1033",1033,0.049,NA,2183,"Kaua'i Golden Ale","American Blonde Ale",204,12,"American Blonde Ale",205,"Hawai'i Nui Brewing Co.","Hilo","HI","Kaua'i Golden Ale (Hawai'i Nui Brewing Co.)" +"1034",1034,0.054,NA,2182,"Sunset Amber","American Pale Ale (APA)",204,12,"American Pale Ale (APA)",205,"Hawai'i Nui Brewing Co.","Hilo","HI","Sunset Amber (Hawai'i Nui Brewing Co.)" +"1035",1035,0.064,NA,2181,"Hapa Brown Ale","American Brown Ale",204,19.2,NA,205,"Hawai'i Nui Brewing Co.","Hilo","HI","Hapa Brown Ale (Hawai'i Nui Brewing Co.)" +"1036",1036,0.064,NA,2180,"Hapa Brown Ale","American Brown Ale",204,12,NA,205,"Hawai'i Nui Brewing Co.","Hilo","HI","Hapa Brown Ale (Hawai'i Nui Brewing Co.)" +"1037",1037,0.083,NA,2179,"Southern Cross","Flanders Red Ale",204,19.2,NA,205,"Hawai'i Nui Brewing Co.","Hilo","HI","Southern Cross (Hawai'i Nui Brewing Co.)" +"1038",1038,0.076,65,1895,"Groupe G","Belgian IPA",280,16,NA,281,"Headlands Brewing Company","Mill Valley","CA","Groupe G (Headlands Brewing Company)" +"1039",1039,0.062,40,1894,"Pt. Bonita Rustic Lager","American Pale Lager",280,16,NA,281,"Headlands Brewing Company","Mill Valley","CA","Pt. Bonita Rustic Lager (Headlands Brewing Company)" +"1040",1040,0.088,77,1893,"Hill 88 Double IPA","American Double / Imperial IPA",280,16,"American Double / Imperial IPA",281,"Headlands Brewing Company","Mill Valley","CA","Hill 88 Double IPA (Headlands Brewing Company)" +"1041",1041,0.072,45,990,"Loose Cannon","American IPA",479,12,"American IPA",480,"Heavy Seas Beer","Halethorpe","MD","Loose Cannon (Heavy Seas Beer)" +"1042",1042,0.06,30,989,"AARGHtoberfest!","Märzen / Oktoberfest",479,12,NA,480,"Heavy Seas Beer","Halethorpe","MD","AARGHtoberfest! (Heavy Seas Beer)" +"1043",1043,0.06,NA,988,"Davy Jones Lager","Cream Ale",479,12,NA,480,"Heavy Seas Beer","Halethorpe","MD","Davy Jones Lager (Heavy Seas Beer)" +"1044",1044,0.063,30,1351,"Grazias","Cream Ale",423,16,NA,424,"Hess Brewing Company","San Diego","CA","Grazias (Hess Brewing Company)" +"1045",1045,0.08,86,1346,"Habitus IPA","American IPA",423,16,"American IPA",424,"Hess Brewing Company","San Diego","CA","Habitus IPA (Hess Brewing Company)" +"1046",1046,0.099,85,904,"Ex Umbris Rye Imperial Stout","American Double / Imperial Stout",423,16,NA,424,"Hess Brewing Company","San Diego","CA","Ex Umbris Rye Imperial Stout (Hess Brewing Company)" +"1047",1047,0.063,21,2295,"The Golden One","American Pilsner",168,12,NA,169,"High Hops Brewery","Windsor","CO","The Golden One (High Hops Brewery)" +"1048",1048,0.07,68,2294,"The Power of Zeus","American Pale Ale (APA)",168,12,"American Pale Ale (APA)",169,"High Hops Brewery","Windsor","CO","The Power of Zeus (High Hops Brewery)" +"1049",1049,0.044,22,824,"Tonganoxie Honey Wheat","American Pale Wheat Ale",500,12,"American Pale Wheat Ale",501,"High Noon Saloon And Brewery","Leavenworth","KS","Tonganoxie Honey Wheat (High Noon Saloon And Brewery)" +"1050",1050,0.045,NA,616,"Oregon Trail Unfiltered Raspberry Wheat","Fruit / Vegetable Beer",500,12,NA,501,"High Noon Saloon And Brewery","Leavenworth","KS","Oregon Trail Unfiltered Raspberry Wheat (High Noon Saloon And Brewery)" +"1051",1051,0.055,NA,96,"Annie's Amber Ale","American Amber / Red Ale",500,12,"American Amber / Red Ale",501,"High Noon Saloon And Brewery","Leavenworth","KS","Annie's Amber Ale (High Noon Saloon And Brewery)" +"1052",1052,0.045,32,1615,"The 12th Can™","American Pale Ale (APA)",362,16,"American Pale Ale (APA)",363,"Hilliard's Beer","Seattle","WA","The 12th Can™ (Hilliard's Beer)" +"1053",1053,0.055,34,889,"Hilliard's Pils","Czech Pilsener",362,16,NA,363,"Hilliard's Beer","Seattle","WA","Hilliard's Pils (Hilliard's Beer)" +"1054",1054,0.049,20,724,"Hilliard's Blonde","American Blonde Ale",362,16,"American Blonde Ale",363,"Hilliard's Beer","Seattle","WA","Hilliard's Blonde (Hilliard's Beer)" +"1055",1055,0.055,60,497,"Hilliard's Amber Ale","American Amber / Red Ale",362,16,"American Amber / Red Ale",363,"Hilliard's Beer","Seattle","WA","Hilliard's Amber Ale (Hilliard's Beer)" +"1056",1056,0.066,30,496,"Hilliard's Saison","Saison / Farmhouse Ale",362,16,NA,363,"Hilliard's Beer","Seattle","WA","Hilliard's Saison (Hilliard's Beer)" +"1057",1057,0.042,NA,1652,"White Cap White IPA","American White IPA",349,16,NA,350,"Hinterland Brewery","Green Bay","WI","White Cap White IPA (Hinterland Brewery)" +"1058",1058,0.042,25,1835,"Provision","Saison / Farmhouse Ale",297,12,NA,298,"Hop Farm Brewing Company","Pittsburgh","PA","Provision (Hop Farm Brewing Company)" +"1059",1059,0.047,28,1834,"One Nut Brown","American Brown Ale",297,12,NA,298,"Hop Farm Brewing Company","Pittsburgh","PA","One Nut Brown (Hop Farm Brewing Company)" +"1060",1060,0.0579999999999999,45,1833,"Hop Farm IPA","American IPA",297,12,"American IPA",298,"Hop Farm Brewing Company","Pittsburgh","PA","Hop Farm IPA (Hop Farm Brewing Company)" +"1061",1061,0.049,20,2195,"Double D Blonde","American Blonde Ale",198,12,"American Blonde Ale",199,"Hop Valley Brewing Company","Springfield","OR","Double D Blonde (Hop Valley Brewing Company)" +"1062",1062,0.078,60,1605,"Festeroo Winter Ale","American Strong Ale",198,12,NA,199,"Hop Valley Brewing Company","Springfield","OR","Festeroo Winter Ale (Hop Valley Brewing Company)" +"1063",1063,0.063,70,1543,"Proxima IPA","American IPA",198,12,"American IPA",199,"Hop Valley Brewing Company","Springfield","OR","Proxima IPA (Hop Valley Brewing Company)" +"1064",1064,0.049,20,1390,"Double D Blonde (2013)","American Blonde Ale",198,12,"American Blonde Ale",199,"Hop Valley Brewing Company","Springfield","OR","Double D Blonde (2013) (Hop Valley Brewing Company)" +"1065",1065,0.048,13,1354,"541 American Lager","American Pale Lager",198,12,NA,199,"Hop Valley Brewing Company","Springfield","OR","541 American Lager (Hop Valley Brewing Company)" +"1066",1066,0.065,90,1353,"Alphadelic IPA","American IPA",198,12,"American IPA",199,"Hop Valley Brewing Company","Springfield","OR","Alphadelic IPA (Hop Valley Brewing Company)" +"1067",1067,0.065,90,499,"Alphadelic IPA (2011)","American IPA",198,12,"American IPA",199,"Hop Valley Brewing Company","Springfield","OR","Alphadelic IPA (2011) (Hop Valley Brewing Company)" +"1068",1068,0.049,20,498,"Double D Blonde (2011)","American Blonde Ale",198,12,"American Blonde Ale",199,"Hop Valley Brewing Company","Springfield","OR","Double D Blonde (2011) (Hop Valley Brewing Company)" +"1069",1069,0.07,NA,1501,"Green House India Pale Ale","American IPA",395,12,"American IPA",396,"Hops & Grain Brewery","Austin","TX","Green House India Pale Ale (Hops & Grain Brewery)" +"1070",1070,0.051,NA,1004,"The One They Call Zoe","American Pale Lager",395,12,NA,396,"Hops & Grain Brewery","Austin","TX","The One They Call Zoe (Hops & Grain Brewery)" +"1071",1071,0.051,40,502,"Alteration","Altbier",395,12,NA,396,"Hops & Grain Brewery","Austin","TX","Alteration (Hops & Grain Brewery)" +"1072",1072,0.06,50,501,"Pale Dog","American Pale Ale (APA)",395,12,"American Pale Ale (APA)",396,"Hops & Grain Brewery","Austin","TX","Pale Dog (Hops & Grain Brewery)" +"1073",1073,0.065,NA,2357,"Porter Culture","American Porter",136,12,NA,137,"Hops & Grains Brewing Company","Austin","TX","Porter Culture (Hops & Grains Brewing Company)" +"1074",1074,0.068,NA,2483,"Hard Cider","Cider",80,16,NA,81,"Hopworks Urban Brewery","Portland","OR","Hard Cider (Hopworks Urban Brewery)" +"1075",1075,0.027,21,2482,"Totally Radler","Radler",80,16,NA,81,"Hopworks Urban Brewery","Portland","OR","Totally Radler (Hopworks Urban Brewery)" +"1076",1076,0.039,20,2400,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1077",1077,0.039,20,2399,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1078",1078,0.039,20,2398,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1079",1079,0.039,20,2397,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1080",1080,0.039,20,2396,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1081",1081,0.039,20,2395,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1082",1082,0.039,20,2394,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1083",1083,0.039,20,2393,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1084",1084,0.039,20,2392,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1085",1085,0.039,20,2391,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1086",1086,0.039,20,2390,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1087",1087,0.039,20,2389,"Nonstop Hef Hop","American Pale Wheat Ale",80,16,"American Pale Wheat Ale",81,"Hopworks Urban Brewery","Portland","OR","Nonstop Hef Hop (Hopworks Urban Brewery)" +"1088",1088,0.0579999999999999,60,2388,"Rise Up Red","American Amber / Red Ale",80,16,"American Amber / Red Ale",81,"Hopworks Urban Brewery","Portland","OR","Rise Up Red (Hopworks Urban Brewery)" +"1089",1089,0.0579999999999999,35,2200,"Survival Stout","American Stout",80,16,NA,81,"Hopworks Urban Brewery","Portland","OR","Survival Stout (Hopworks Urban Brewery)" +"1090",1090,0.066,75,2199,"Hopworks IPA","American IPA",80,16,"American IPA",81,"Hopworks Urban Brewery","Portland","OR","Hopworks IPA (Hopworks Urban Brewery)" +"1091",1091,0.073,70,2193,"Abominable Winter Ale","American Strong Ale",80,16,NA,81,"Hopworks Urban Brewery","Portland","OR","Abominable Winter Ale (Hopworks Urban Brewery)" +"1092",1092,0.06,60,1398,"Pigwar White India Pale Ale","American White IPA",80,16,NA,81,"Hopworks Urban Brewery","Portland","OR","Pigwar White India Pale Ale (Hopworks Urban Brewery)" +"1093",1093,0.0579999999999999,60,1085,"Rise-Up Red (2014)","American Amber / Red Ale",80,16,"American Amber / Red Ale",81,"Hopworks Urban Brewery","Portland","OR","Rise-Up Red (2014) (Hopworks Urban Brewery)" +"1094",1094,0.073,70,916,"Abominable Winter Ale (2012)","American Strong Ale",80,16,NA,81,"Hopworks Urban Brewery","Portland","OR","Abominable Winter Ale (2012) (Hopworks Urban Brewery)" +"1095",1095,0.051,32,658,"HUB Lager","Czech Pilsener",80,16,NA,81,"Hopworks Urban Brewery","Portland","OR","HUB Lager (Hopworks Urban Brewery)" +"1096",1096,0.066,75,653,"Hopworks IPA (2012)","American IPA",80,16,"American IPA",81,"Hopworks Urban Brewery","Portland","OR","Hopworks IPA (2012) (Hopworks Urban Brewery)" +"1097",1097,0.0559999999999999,NA,2385,"Watermelon Wheat","American Pale Wheat Ale",120,12,"American Pale Wheat Ale",121,"Horny Goat Brew Pub","Milwaukee","WI","Watermelon Wheat (Horny Goat Brew Pub)" +"1098",1098,0.051,17,2384,"Laka Laka Pineapple","Hefeweizen",120,12,NA,121,"Horny Goat Brew Pub","Milwaukee","WI","Laka Laka Pineapple (Horny Goat Brew Pub)" +"1099",1099,0.06,NA,2383,"Oktoberfest","Märzen / Oktoberfest",120,16,NA,121,"Horny Goat Brew Pub","Milwaukee","WI","Oktoberfest (Horny Goat Brew Pub)" +"1100",1100,0.065,NA,1251,"Trail Maker Pale Ale","American Pale Ale (APA)",445,12,"American Pale Ale (APA)",446,"Howard Brewing Company","Lenoir","NC","Trail Maker Pale Ale (Howard Brewing Company)" +"1101",1101,0.055,NA,1250,"Action Man Lager","Vienna Lager",445,12,NA,446,"Howard Brewing Company","Lenoir","NC","Action Man Lager (Howard Brewing Company)" +"1102",1102,0.068,90,1903,"Let It Ride IPA","American IPA",277,12,"American IPA",278,"Indeed Brewing Company","Minneapolis","MN","Let It Ride IPA (Indeed Brewing Company)" +"1103",1103,0.065,22,1691,"Stir Crazy Winter Ale","Winter Warmer",277,12,NA,278,"Indeed Brewing Company","Minneapolis","MN","Stir Crazy Winter Ale (Indeed Brewing Company)" +"1104",1104,0.05,10,1555,"Sweet Yamma Jamma Ale","Fruit / Vegetable Beer",277,12,NA,278,"Indeed Brewing Company","Minneapolis","MN","Sweet Yamma Jamma Ale (Indeed Brewing Company)" +"1105",1105,0.046,27,1115,"Shenanigans Summer Ale","American Pale Wheat Ale",277,12,"American Pale Wheat Ale",278,"Indeed Brewing Company","Minneapolis","MN","Shenanigans Summer Ale (Indeed Brewing Company)" +"1106",1106,0.065,80,729,"Midnight Ryder","American Black Ale",277,12,NA,278,"Indeed Brewing Company","Minneapolis","MN","Midnight Ryder (Indeed Brewing Company)" +"1107",1107,0.054,45,728,"Day Tripper Pale Ale","American Pale Ale (APA)",277,12,"American Pale Ale (APA)",278,"Indeed Brewing Company","Minneapolis","MN","Day Tripper Pale Ale (Indeed Brewing Company)" +"1108",1108,0.048,32,2350,"Oklahoma Suks","American Amber / Red Ale",140,12,"American Amber / Red Ale",141,"Independence Brewing Company","Austin","TX","Oklahoma Suks (Independence Brewing Company)" +"1109",1109,0.055,42,2301,"Power & Light","American Pale Ale (APA)",140,12,"American Pale Ale (APA)",141,"Independence Brewing Company","Austin","TX","Power & Light (Independence Brewing Company)" +"1110",1110,0.059,27,1904,"White Rabbit","Witbier",140,12,NA,141,"Independence Brewing Company","Austin","TX","White Rabbit (Independence Brewing Company)" +"1111",1111,0.0579999999999999,58,2609,"Tribute","American Pale Ale (APA)",23,12,"American Pale Ale (APA)",24,"Indiana City Brewing","Indianapolis","IN","Tribute (Indiana City Brewing)" +"1112",1112,0.07,75,2038,"Infamous IPA","American IPA",242,12,"American IPA",243,"Infamous Brewing Company","Austin","TX","Infamous IPA (Infamous Brewing Company)" +"1113",1113,0.055,20,1774,"Hijack","Cream Ale",242,12,NA,243,"Infamous Brewing Company","Austin","TX","Hijack (Infamous Brewing Company)" +"1114",1114,0.045,20,559,"Jon Boat Coastal Ale","American Blonde Ale",527,12,"American Blonde Ale",528,"Intuition Ale Works","Jacksonville","FL","Jon Boat Coastal Ale (Intuition Ale Works)" +"1115",1115,0.068,55,558,"I-10 IPA","American IPA",527,12,"American IPA",528,"Intuition Ale Works","Jacksonville","FL","I-10 IPA (Intuition Ale Works)" +"1116",1116,0.053,28,553,"People's Pale Ale","American Pale Ale (APA)",527,12,"American Pale Ale (APA)",528,"Intuition Ale Works","Jacksonville","FL","People's Pale Ale (Intuition Ale Works)" +"1117",1117,0.049,NA,2376,"Summer Ale","American Blonde Ale",123,12,"American Blonde Ale",124,"Ipswich Ale Brewery","Ipswich","MA","Summer Ale (Ipswich Ale Brewery)" +"1118",1118,NA,NA,1784,"Appreciation Ale","American IPA",316,16,"American IPA",317,"Iron Hill Brewery & Restaurant","Wilmington","DE","Appreciation Ale (Iron Hill Brewery & Restaurant)" +"1119",1119,0.052,18,2673,"House Lager","Keller Bier / Zwickel Bier",2,16,NA,3,"Jack's Abby Craft Lagers","Framingham","MA","House Lager (Jack's Abby Craft Lagers)" +"1120",1120,0.048,15,2672,"Leisure Time","American Pale Lager",2,12,NA,3,"Jack's Abby Craft Lagers","Framingham","MA","Leisure Time (Jack's Abby Craft Lagers)" +"1121",1121,0.072,80,2671,"Excess IPL","American India Pale Lager",2,16,NA,3,"Jack's Abby Craft Lagers","Framingham","MA","Excess IPL (Jack's Abby Craft Lagers)" +"1122",1122,0.067,65,2670,"Hoponius Union","American India Pale Lager",2,12,NA,3,"Jack's Abby Craft Lagers","Framingham","MA","Hoponius Union (Jack's Abby Craft Lagers)" +"1123",1123,0.049,45,2669,"Calyptra","American India Pale Lager",2,12,NA,3,"Jack's Abby Craft Lagers","Framingham","MA","Calyptra (Jack's Abby Craft Lagers)" +"1124",1124,0.05,NA,1405,"Helen's Blend","Cider",416,12,NA,417,"Jack's Hard Cider (Hauser Estate...","Biglerville","PA","Helen's Blend (Jack's Hard Cider (Hauser Estate...)" +"1125",1125,0.051,NA,823,"Jack's Hard Cider","Cider",416,12,NA,417,"Jack's Hard Cider (Hauser Estate...","Biglerville","PA","Jack's Hard Cider (Jack's Hard Cider (Hauser Estate...)" +"1126",1126,0.055,37,1793,"Thunder Ann","American Pale Ale (APA)",312,12,"American Pale Ale (APA)",313,"Jackalope Brewing Company","Nashville","TN","Thunder Ann (Jackalope Brewing Company)" +"1127",1127,0.055,NA,2453,"Razz Wheat","Fruit / Vegetable Beer",92,12,NA,93,"Jackie O's Pub & Brewery","Athens","OH","Razz Wheat (Jackie O's Pub & Brewery)" +"1128",1128,0.065,NA,2363,"Hop Ryot","American IPA",92,12,"American IPA",93,"Jackie O's Pub & Brewery","Athens","OH","Hop Ryot (Jackie O's Pub & Brewery)" +"1129",1129,0.07,NA,689,"Mystic Mama IPA","American IPA",92,12,"American IPA",93,"Jackie O's Pub & Brewery","Athens","OH","Mystic Mama IPA (Jackie O's Pub & Brewery)" +"1130",1130,0.05,NA,688,"Firefly Amber Ale","American Amber / Red Ale",92,12,"American Amber / Red Ale",93,"Jackie O's Pub & Brewery","Athens","OH","Firefly Amber Ale (Jackie O's Pub & Brewery)" +"1131",1131,0.067,NA,687,"Chomolungma Honey Nut Brown Ale","English Brown Ale",92,12,NA,93,"Jackie O's Pub & Brewery","Athens","OH","Chomolungma Honey Nut Brown Ale (Jackie O's Pub & Brewery)" +"1132",1132,0.069,NA,2408,"Welcome to Scoville","American IPA",114,12,"American IPA",115,"Jailbreak Brewing Company","Laurel","MD","Welcome to Scoville (Jailbreak Brewing Company)" +"1133",1133,NA,NA,2595,"Bastian","American Strong Ale",32,12,NA,33,"James Page Brewing Company","Stevens Point","WI","Bastian (James Page Brewing Company)" +"1134",1134,0.045,NA,2480,"Healani","Hefeweizen",32,12,NA,33,"James Page Brewing Company","Stevens Point","WI","Healani (James Page Brewing Company)" +"1135",1135,0.055,NA,1525,"Yabba Dhaba Chai Tea Porter","American Porter",32,12,NA,33,"James Page Brewing Company","Stevens Point","WI","Yabba Dhaba Chai Tea Porter (James Page Brewing Company)" +"1136",1136,0.055,NA,1524,"A Capella Gluten Free Pale Ale","American Pale Ale (APA)",32,12,"American Pale Ale (APA)",33,"James Page Brewing Company","Stevens Point","WI","A Capella Gluten Free Pale Ale (James Page Brewing Company)" +"1137",1137,0.06,NA,1523,"Casper White Stout","American Blonde Ale",32,12,"American Blonde Ale",33,"James Page Brewing Company","Stevens Point","WI","Casper White Stout (James Page Brewing Company)" +"1138",1138,0.06,NA,1254,"JP's Ould Sod Irish Red IPA","American IPA",32,12,"American IPA",33,"James Page Brewing Company","Stevens Point","WI","JP's Ould Sod Irish Red IPA (James Page Brewing Company)" +"1139",1139,0.05,15,2060,"Weize Guy","Hefeweizen",233,12,NA,234,"Joseph James Brewing Company","Henderson","NV","Weize Guy (Joseph James Brewing Company)" +"1140",1140,0.05,50,469,"Fox Tail Gluten Free Ale","American Pale Ale (APA)",233,12,"American Pale Ale (APA)",234,"Joseph James Brewing Company","Henderson","NV","Fox Tail Gluten Free Ale (Joseph James Brewing Company)" +"1141",1141,0.093,90,468,"Hop Box Imperial IPA","American Double / Imperial IPA",233,12,"American Double / Imperial IPA",234,"Joseph James Brewing Company","Henderson","NV","Hop Box Imperial IPA (Joseph James Brewing Company)" +"1142",1142,0.052,15,467,"Joseph James American Lager","American Adjunct Lager",233,12,NA,234,"Joseph James Brewing Company","Henderson","NV","Joseph James American Lager (Joseph James Brewing Company)" +"1143",1143,0.071,NA,2163,"Sucha Much IPA","American IPA",208,12,"American IPA",209,"Kalona Brewing Company","Kalona","IA","Sucha Much IPA (Kalona Brewing Company)" +"1144",1144,0.075,24,2162,"Lewbricator Wheat Dopplebock","Doppelbock",208,12,NA,209,"Kalona Brewing Company","Kalona","IA","Lewbricator Wheat Dopplebock (Kalona Brewing Company)" +"1145",1145,0.052,16,2374,"Weisse Versa (2012)","Hefeweizen",125,12,NA,126,"Karbach Brewing Company","Houston","TX","Weisse Versa (2012) (Karbach Brewing Company)" +"1146",1146,0.0579999999999999,25,1560,"Mother in Lager","Munich Dunkel Lager",125,12,NA,126,"Karbach Brewing Company","Houston","TX","Mother in Lager (Karbach Brewing Company)" +"1147",1147,0.055,40,1557,"Weekend Warrior Pale Ale","American Pale Ale (APA)",125,12,"American Pale Ale (APA)",126,"Karbach Brewing Company","Houston","TX","Weekend Warrior Pale Ale (Karbach Brewing Company)" +"1148",1148,0.055,25,1458,"Karbachtoberfest","Märzen / Oktoberfest",125,12,NA,126,"Karbach Brewing Company","Houston","TX","Karbachtoberfest (Karbach Brewing Company)" +"1149",1149,0.047,20,1235,"Love Street Summer Seasonal (2014)","Kölsch",125,12,NA,126,"Karbach Brewing Company","Houston","TX","Love Street Summer Seasonal (2014) (Karbach Brewing Company)" +"1150",1150,0.066,20,1068,"Barn Burner Saison","Saison / Farmhouse Ale",125,12,NA,126,"Karbach Brewing Company","Houston","TX","Barn Burner Saison (Karbach Brewing Company)" +"1151",1151,0.095,85,666,"Rodeo Clown Double IPA","American Double / Imperial IPA",125,12,"American Double / Imperial IPA",126,"Karbach Brewing Company","Houston","TX","Rodeo Clown Double IPA (Karbach Brewing Company)" +"1152",1152,0.049,45,465,"Sympathy for the Lager","American Amber / Red Lager",125,12,NA,126,"Karbach Brewing Company","Houston","TX","Sympathy for the Lager (Karbach Brewing Company)" +"1153",1153,0.052,15,464,"Weisse Versa","Hefeweizen",125,12,NA,126,"Karbach Brewing Company","Houston","TX","Weisse Versa (Karbach Brewing Company)" +"1154",1154,0.066,70,463,"Hopadillo India Pale Ale","American IPA",125,12,"American IPA",126,"Karbach Brewing Company","Houston","TX","Hopadillo India Pale Ale (Karbach Brewing Company)" +"1155",1155,0.057,19,1678,"KelSo Nut Brown Lager","Euro Dark Lager",342,12,NA,343,"KelSo Beer Company","Brooklyn","NY","KelSo Nut Brown Lager (KelSo Beer Company)" +"1156",1156,0.06,64,1572,"KelSo India Pale Ale","American IPA",342,12,"American IPA",343,"KelSo Beer Company","Brooklyn","NY","KelSo India Pale Ale (KelSo Beer Company)" +"1157",1157,0.055,23,1348,"KelSo Pilsner","Czech Pilsener",342,12,NA,343,"KelSo Beer Company","Brooklyn","NY","KelSo Pilsner (KelSo Beer Company)" +"1158",1158,0.0579999999999999,NA,1193,"Skilak Scottish Ale","Scottish Ale",458,12,NA,459,"Kenai River Brewing Company","Soldotna","AK","Skilak Scottish Ale (Kenai River Brewing Company)" +"1159",1159,0.05,15,1187,"Peninsula Brewers Reserve (PBR)","American Blonde Ale",458,12,"American Blonde Ale",459,"Kenai River Brewing Company","Soldotna","AK","Peninsula Brewers Reserve (PBR) (Kenai River Brewing Company)" +"1160",1160,0.068,NA,349,"Sunken Island IPA","American IPA",458,12,"American IPA",459,"Kenai River Brewing Company","Soldotna","AK","Sunken Island IPA (Kenai River Brewing Company)" +"1161",1161,0.0579999999999999,NA,348,"Skilak Scottish Ale (2011)","Scottish Ale",458,12,NA,459,"Kenai River Brewing Company","Soldotna","AK","Skilak Scottish Ale (2011) (Kenai River Brewing Company)" +"1162",1162,0.065,11,760,"Cold Smoke Scotch Ale (2007)","Scotch Ale / Wee Heavy",510,16,NA,511,"Kettle House Brewing Company","Missoula","MT","Cold Smoke Scotch Ale (2007) (Kettle House Brewing Company)" +"1163",1163,0.065,65,759,"Double Haul IPA (2009)","American IPA",510,16,"American IPA",511,"Kettle House Brewing Company","Missoula","MT","Double Haul IPA (2009) (Kettle House Brewing Company)" +"1164",1164,0.065,65,758,"Double Haul IPA (2006)","American IPA",510,16,"American IPA",511,"Kettle House Brewing Company","Missoula","MT","Double Haul IPA (2006) (Kettle House Brewing Company)" +"1165",1165,0.055,50,87,"Eddy Out Pale Ale","American Pale Ale (APA)",510,16,"American Pale Ale (APA)",511,"Kettle House Brewing Company","Missoula","MT","Eddy Out Pale Ale (Kettle House Brewing Company)" +"1166",1166,0.065,65,86,"Double Haul IPA","American IPA",510,16,"American IPA",511,"Kettle House Brewing Company","Missoula","MT","Double Haul IPA (Kettle House Brewing Company)" +"1167",1167,0.065,11,85,"Cold Smoke Scotch Ale","Scotch Ale / Wee Heavy",510,16,NA,511,"Kettle House Brewing Company","Missoula","MT","Cold Smoke Scotch Ale (Kettle House Brewing Company)" +"1168",1168,NA,NA,2472,"U. P. Witbier","Witbier",84,12,NA,85,"Keweenaw Brewing Company","Houghton","MI","U. P. Witbier (Keweenaw Brewing Company)" +"1169",1169,NA,NA,779,"November Gale Pale Ale","American Pale Ale (APA)",84,12,"American Pale Ale (APA)",85,"Keweenaw Brewing Company","Houghton","MI","November Gale Pale Ale (Keweenaw Brewing Company)" +"1170",1170,NA,NA,364,"Olde Ore Dock Scottish Ale","Scottish Ale",84,12,NA,85,"Keweenaw Brewing Company","Houghton","MI","Olde Ore Dock Scottish Ale (Keweenaw Brewing Company)" +"1171",1171,NA,NA,60,"Widow Maker Black Ale","American Brown Ale",84,12,NA,85,"Keweenaw Brewing Company","Houghton","MI","Widow Maker Black Ale (Keweenaw Brewing Company)" +"1172",1172,NA,NA,59,"Lift Bridge Brown Ale","American Brown Ale",84,12,NA,85,"Keweenaw Brewing Company","Houghton","MI","Lift Bridge Brown Ale (Keweenaw Brewing Company)" +"1173",1173,NA,NA,58,"Pick Axe Blonde Ale","American Blonde Ale",84,12,"American Blonde Ale",85,"Keweenaw Brewing Company","Houghton","MI","Pick Axe Blonde Ale (Keweenaw Brewing Company)" +"1174",1174,NA,NA,57,"Red Jacket Amber Ale","American Amber / Red Ale",84,12,"American Amber / Red Ale",85,"Keweenaw Brewing Company","Houghton","MI","Red Jacket Amber Ale (Keweenaw Brewing Company)" +"1175",1175,0.051,NA,2436,"Amber Ale","American Amber / Red Ale",102,12,"American Amber / Red Ale",103,"King Street Brewing Company","Anchorage","AK","Amber Ale (King Street Brewing Company)" +"1176",1176,0.055,NA,1706,"King Street Pilsner","Czech Pilsener",102,12,NA,103,"King Street Brewing Company","Anchorage","AK","King Street Pilsner (King Street Brewing Company)" +"1177",1177,0.06,70,1667,"King Street IPA","American IPA",102,12,"American IPA",103,"King Street Brewing Company","Anchorage","AK","King Street IPA (King Street Brewing Company)" +"1178",1178,0.057,10,1666,"King Street Hefeweizen","Hefeweizen",102,12,NA,103,"King Street Brewing Company","Anchorage","AK","King Street Hefeweizen (King Street Brewing Company)" +"1179",1179,0.049,NA,1665,"King Street Blonde Ale","American Blonde Ale",102,12,"American Blonde Ale",103,"King Street Brewing Company","Anchorage","AK","King Street Blonde Ale (King Street Brewing Company)" +"1180",1180,0.063,65,2460,"India Pale Ale","American IPA",87,16,"American IPA",88,"Kirkwood Station Brewing Company","Kirkwood","MO","India Pale Ale (Kirkwood Station Brewing Company)" +"1181",1181,0.048,11,2459,"Blackberry Wheat","American Pale Wheat Ale",87,16,"American Pale Wheat Ale",88,"Kirkwood Station Brewing Company","Kirkwood","MO","Blackberry Wheat (Kirkwood Station Brewing Company)" +"1182",1182,0.046,18,1274,"Longboard Island Lager","American Amber / Red Lager",439,24,NA,440,"Kona Brewing Company","Kona","HI","Longboard Island Lager (Kona Brewing Company)" +"1183",1183,0.046,18,1220,"Longboard Island Lager","American Amber / Red Lager",439,16,NA,440,"Kona Brewing Company","Kona","HI","Longboard Island Lager (Kona Brewing Company)" +"1184",1184,0.046,18,1070,"Longboard Island Lager","American Amber / Red Lager",439,12,NA,440,"Kona Brewing Company","Kona","HI","Longboard Island Lager (Kona Brewing Company)" +"1185",1185,0.046,18,590,"Longboard Island Lager","American Amber / Red Lager",439,12,NA,440,"Kona Brewing Company","Kona","HI","Longboard Island Lager (Kona Brewing Company)" +"1186",1186,0.04,9,781,"Choc Beer (2003)","American Dark Wheat Ale",505,12,NA,506,"Krebs Brewing Company (Pete's Pl...","Krebs","OK","Choc Beer (2003) (Krebs Brewing Company (Pete's Pl...)" +"1187",1187,0.08,NA,1637,"Bellingham Beer Week 2013 Collaboration","Belgian Strong Dark Ale",354,16,NA,355,"Kulshan Brewery","Bellingham","WA","Bellingham Beer Week 2013 Collaboration (Kulshan Brewery)" +"1188",1188,0.054,15,1741,"A Slice of Hefen","Hefeweizen",332,16,NA,333,"La Cumbre Brewing Company","Albuquerque","NM","A Slice of Hefen (La Cumbre Brewing Company)" +"1189",1189,0.072,100,664,"Elevated IPA","American IPA",332,16,"American IPA",333,"La Cumbre Brewing Company","Albuquerque","NM","Elevated IPA (La Cumbre Brewing Company)" +"1190",1190,0.066,30,392,"Rumspringa Golden Bock","Maibock / Helles Bock",545,12,NA,546,"Lancaster Brewing Company","Lancaster","PA","Rumspringa Golden Bock (Lancaster Brewing Company)" +"1191",1191,0.048,28,195,"Lancaster German Style Kölsch","Kölsch",545,12,NA,546,"Lancaster Brewing Company","Lancaster","PA","Lancaster German Style Kölsch (Lancaster Brewing Company)" +"1192",1192,0.045,NA,2547,"Beach Cruiser","Hefeweizen",59,12,NA,60,"Latitude 42 Brewing Company","Portage","MI","Beach Cruiser (Latitude 42 Brewing Company)" +"1193",1193,0.068,NA,2493,"I.P. Eh!","American IPA",59,12,"American IPA",60,"Latitude 42 Brewing Company","Portage","MI","I.P. Eh! (Latitude 42 Brewing Company)" +"1194",1194,0.05,NA,2492,"Schoolhouse Honey","American Amber / Red Ale",59,12,"American Amber / Red Ale",60,"Latitude 42 Brewing Company","Portage","MI","Schoolhouse Honey (Latitude 42 Brewing Company)" +"1195",1195,0.055,NA,2491,"10 Degrees of Separation","English Brown Ale",59,12,NA,60,"Latitude 42 Brewing Company","Portage","MI","10 Degrees of Separation (Latitude 42 Brewing Company)" +"1196",1196,0.05,12,2108,"Laughing Dog Cream Ale","Cream Ale",218,12,NA,219,"Laughing Dog Brewing Company","Ponderay","ID","Laughing Dog Cream Ale (Laughing Dog Brewing Company)" +"1197",1197,0.048,9,1397,"Two-One Niner","American Pilsner",218,12,NA,219,"Laughing Dog Brewing Company","Ponderay","ID","Two-One Niner (Laughing Dog Brewing Company)" +"1198",1198,0.064,66,1396,"Laughing Dog IPA","American IPA",218,12,"American IPA",219,"Laughing Dog Brewing Company","Ponderay","ID","Laughing Dog IPA (Laughing Dog Brewing Company)" +"1199",1199,0.064,95,1675,"Madra Allta","American IPA",345,12,"American IPA",346,"Lavery Brewing Company","Erie","PA","Madra Allta (Lavery Brewing Company)" +"1200",1200,0.0559999999999999,70,1249,"Duluchan India Pale Ale","American IPA",345,12,"American IPA",346,"Lavery Brewing Company","Erie","PA","Duluchan India Pale Ale (Lavery Brewing Company)" +"1201",1201,0.05,NA,1445,"Lazy Monk Bohemian Pilsner","Czech Pilsener",406,16,NA,407,"Lazy Monk Brewing","Eau Claire","WI","Lazy Monk Bohemian Pilsner (Lazy Monk Brewing)" +"1202",1202,0.051,NA,475,"Yellowstone Golden Ale","Kölsch",537,12,NA,538,"Lewis and Clark Brewing Company","Helena","MT","Yellowstone Golden Ale (Lewis and Clark Brewing Company)" +"1203",1203,0.057,NA,474,"Tumbleweed IPA","American IPA",537,12,"American IPA",538,"Lewis and Clark Brewing Company","Helena","MT","Tumbleweed IPA (Lewis and Clark Brewing Company)" +"1204",1204,0.05,NA,473,"Lewis & Clark Amber Ale","American Amber / Red Ale",537,12,"American Amber / Red Ale",538,"Lewis and Clark Brewing Company","Helena","MT","Lewis & Clark Amber Ale (Lewis and Clark Brewing Company)" +"1205",1205,0.05,NA,472,"Miner's Gold Hefeweizen","Hefeweizen",537,12,NA,538,"Lewis and Clark Brewing Company","Helena","MT","Miner's Gold Hefeweizen (Lewis and Clark Brewing Company)" +"1206",1206,0.057,NA,471,"Back Country Scottish Ale","Scottish Ale",537,12,NA,538,"Lewis and Clark Brewing Company","Helena","MT","Back Country Scottish Ale (Lewis and Clark Brewing Company)" +"1207",1207,0.052,30,2036,"Getaway","German Pilsener",244,16,NA,245,"Lift Bridge Brewing Company","Stillwater","MN","Getaway (Lift Bridge Brewing Company)" +"1208",1208,0.06,30,1168,"Farm Girl Saison","Saison / Farmhouse Ale",244,16,NA,245,"Lift Bridge Brewing Company","Stillwater","MN","Farm Girl Saison (Lift Bridge Brewing Company)" +"1209",1209,0.0579999999999999,40,1832,"Adam's Stout","American Stout",298,12,NA,299,"Liquid Hero Brewery","York","PA","Adam's Stout (Liquid Hero Brewery)" +"1210",1210,0.057,42,1688,"American Hero","American Amber / Red Ale",298,12,"American Amber / Red Ale",299,"Liquid Hero Brewery","York","PA","American Hero (Liquid Hero Brewery)" +"1211",1211,0.052,20,1687,"Schweet Ale","Fruit / Vegetable Beer",298,12,NA,299,"Liquid Hero Brewery","York","PA","Schweet Ale (Liquid Hero Brewery)" +"1212",1212,0.065,75,1686,"Irregardless IPA","American IPA",298,12,"American IPA",299,"Liquid Hero Brewery","York","PA","Irregardless IPA (Liquid Hero Brewery)" +"1213",1213,0.057,40,2434,"Peach Pale Ale","American Pale Ale (APA)",104,12,"American Pale Ale (APA)",105,"Lone Tree Brewing Company","Lone Tree","CO","Peach Pale Ale (Lone Tree Brewing Company)" +"1214",1214,0.06,NA,2332,"Deadeye Jack","American Porter",149,12,NA,150,"Lonerider Brewing Company","Raleigh","NC","Deadeye Jack (Lonerider Brewing Company)" +"1215",1215,0.075,NA,2330,"Pistols at Dawn","American Stout",149,16,NA,150,"Lonerider Brewing Company","Raleigh","NC","Pistols at Dawn (Lonerider Brewing Company)" +"1216",1216,0.057,47,2329,"Peacemaker Pale Ale","American Pale Ale (APA)",149,12,"American Pale Ale (APA)",150,"Lonerider Brewing Company","Raleigh","NC","Peacemaker Pale Ale (Lonerider Brewing Company)" +"1217",1217,0.0579999999999999,11,2327,"Shotgun Betty","Hefeweizen",149,12,NA,150,"Lonerider Brewing Company","Raleigh","NC","Shotgun Betty (Lonerider Brewing Company)" +"1218",1218,0.061,30,2326,"Sweet Josie","American Brown Ale",149,12,NA,150,"Lonerider Brewing Company","Raleigh","NC","Sweet Josie (Lonerider Brewing Company)" +"1219",1219,0.059,42,1926,"Long Trail IPA","English India Pale Ale (IPA)",268,12,NA,269,"Long Trail Brewing Company","Bridgewater Corners","VT","Long Trail IPA (Long Trail Brewing Company)" +"1220",1220,0.046,30,1924,"Long Trail Ale","American Amber / Red Ale",268,12,"American Amber / Red Ale",269,"Long Trail Brewing Company","Bridgewater Corners","VT","Long Trail Ale (Long Trail Brewing Company)" +"1221",1221,0.072,33,1090,"Double Bag","Altbier",268,16,NA,269,"Long Trail Brewing Company","Bridgewater Corners","VT","Double Bag (Long Trail Brewing Company)" +"1222",1222,0.04,8,574,"Blackbeary Wheat","Fruit / Vegetable Beer",268,12,NA,269,"Long Trail Brewing Company","Bridgewater Corners","VT","Blackbeary Wheat (Long Trail Brewing Company)" +"1223",1223,0.046,30,573,"Long Trail Ale (1)","Altbier",268,12,NA,269,"Long Trail Brewing Company","Bridgewater Corners","VT","Long Trail Ale (1) (Long Trail Brewing Company)" +"1224",1224,0.046,8,2584,"Gose","Gose",41,16,NA,42,"Lost Nation Brewing","East Fairfield","VT","Gose (Lost Nation Brewing)" +"1225",1225,0.048,20,2583,"Vermont Pilsner","German Pilsener",41,16,NA,42,"Lost Nation Brewing","East Fairfield","VT","Vermont Pilsner (Lost Nation Brewing)" +"1226",1226,0.055,NA,2582,"Mosaic Single Hop IPA","American IPA",41,16,"American IPA",42,"Lost Nation Brewing","East Fairfield","VT","Mosaic Single Hop IPA (Lost Nation Brewing)" +"1227",1227,0.045,NA,2581,"Lost Galaxy","American IPA",41,16,"American IPA",42,"Lost Nation Brewing","East Fairfield","VT","Lost Galaxy (Lost Nation Brewing)" +"1228",1228,0.062,65,1309,"Face Plant IPA","American IPA",430,12,"American IPA",431,"Lost Rhino Brewing Company","Ashburn","VA","Face Plant IPA (Lost Rhino Brewing Company)" +"1229",1229,0.0559999999999999,55,1308,"Rhino Chasers Pilsner","Czech Pilsener",430,12,NA,431,"Lost Rhino Brewing Company","Ashburn","VA","Rhino Chasers Pilsner (Lost Rhino Brewing Company)" +"1230",1230,0.052,29,1571,"Slow Hand Stout","American Stout",377,16,NA,378,"Lucette Brewing Company","Menominee","WI","Slow Hand Stout (Lucette Brewing Company)" +"1231",1231,0.062,NA,1204,"Hips Don't Lie","Hefeweizen",456,16,NA,457,"Lucette Brewing Company","Menominie","WI","Hips Don't Lie (Lucette Brewing Company)" +"1232",1232,0.052,NA,1122,"Ride Again Pale Ale","American Pale Ale (APA)",456,16,"American Pale Ale (APA)",457,"Lucette Brewing Company","Menominie","WI","Ride Again Pale Ale (Lucette Brewing Company)" +"1233",1233,0.048,NA,700,"The Farmer's Daughter","American Blonde Ale",456,16,"American Blonde Ale",457,"Lucette Brewing Company","Menominie","WI","The Farmer's Daughter (Lucette Brewing Company)" +"1234",1234,0.038,18,2033,"Pub Ale","English Dark Mild Ale",245,12,NA,246,"Lucky Town Brewing Company","Jackson","MS","Pub Ale (Lucky Town Brewing Company)" +"1235",1235,0.051,31,2032,"Ballistic Blonde","Belgian Pale Ale",245,12,NA,246,"Lucky Town Brewing Company","Jackson","MS","Ballistic Blonde (Lucky Town Brewing Company)" +"1236",1236,0.054,NA,2311,"Knotty Pine","American Pale Ale (APA)",158,12,"American Pale Ale (APA)",159,"Lumberyard Brewing Company","Flagstaff","AZ","Knotty Pine (Lumberyard Brewing Company)" +"1237",1237,0.053,20,1153,"Lumberyard Pilsner","American Pilsner",158,12,NA,159,"Lumberyard Brewing Company","Flagstaff","AZ","Lumberyard Pilsner (Lumberyard Brewing Company)" +"1238",1238,0.061,NA,355,"Lumberyard IPA","American IPA",158,12,"American IPA",159,"Lumberyard Brewing Company","Flagstaff","AZ","Lumberyard IPA (Lumberyard Brewing Company)" +"1239",1239,0.0579999999999999,NA,125,"Lumberyard Red Ale","American Amber / Red Ale",158,12,"American Amber / Red Ale",159,"Lumberyard Brewing Company","Flagstaff","AZ","Lumberyard Red Ale (Lumberyard Brewing Company)" +"1240",1240,0.05,NA,962,"Mac's Highlander Pale Ale (2000)","American Pale Ale (APA)",485,12,"American Pale Ale (APA)",486,"MacTarnahans Brewing Company","Portland","OR","Mac's Highlander Pale Ale (2000) (MacTarnahans Brewing Company)" +"1241",1241,0.051,32,961,"Mac's Scottish Style Amber Ale (2000)","American Amber / Red Ale",485,12,"American Amber / Red Ale",486,"MacTarnahans Brewing Company","Portland","OR","Mac's Scottish Style Amber Ale (2000) (MacTarnahans Brewing Company)" +"1242",1242,0.05,NA,1475,"Macon Progress Ale","American Pale Ale (APA)",400,12,"American Pale Ale (APA)",401,"Macon Beer Company","Macon","GA","Macon Progress Ale (Macon Beer Company)" +"1243",1243,0.055,NA,1008,"Macon History Ale","American Brown Ale",400,12,NA,401,"Macon Beer Company","Macon","GA","Macon History Ale (Macon Beer Company)" +"1244",1244,0.099,NA,2454,"Galaxy High","American Double / Imperial IPA",91,12,"American Double / Imperial IPA",92,"Madtree Brewing Company","Cincinnati","OH","Galaxy High (Madtree Brewing Company)" +"1245",1245,0.043,18,2209,"Sol Drifter","American Blonde Ale",91,12,"American Blonde Ale",92,"Madtree Brewing Company","Cincinnati","OH","Sol Drifter (Madtree Brewing Company)" +"1246",1246,0.085,NA,2133,"Thunder Snow","Winter Warmer",91,12,NA,92,"Madtree Brewing Company","Cincinnati","OH","Thunder Snow (Madtree Brewing Company)" +"1247",1247,0.079,18,1994,"The Great Pumpcan","Fruit / Vegetable Beer",91,16,NA,92,"Madtree Brewing Company","Cincinnati","OH","The Great Pumpcan (Madtree Brewing Company)" +"1248",1248,0.047,11,1816,"LIFT","Kölsch",91,12,NA,92,"Madtree Brewing Company","Cincinnati","OH","LIFT (Madtree Brewing Company)" +"1249",1249,0.05,40,1815,"SPRYE","American Pale Ale (APA)",91,12,"American Pale Ale (APA)",92,"Madtree Brewing Company","Cincinnati","OH","SPRYE (Madtree Brewing Company)" +"1250",1250,0.069,70,1126,"Psychopathy","American IPA",91,12,"American IPA",92,"Madtree Brewing Company","Cincinnati","OH","Psychopathy (Madtree Brewing Company)" +"1251",1251,0.07,32,1125,"Gnarly Brown","American Brown Ale",91,12,NA,92,"Madtree Brewing Company","Cincinnati","OH","Gnarly Brown (Madtree Brewing Company)" +"1252",1252,0.06,30,1124,"Happy Amber","American Amber / Red Ale",91,12,"American Amber / Red Ale",92,"Madtree Brewing Company","Cincinnati","OH","Happy Amber (Madtree Brewing Company)" +"1253",1253,0.051,20,1813,"#9","Fruit / Vegetable Beer",303,16,NA,304,"Magic Hat Brewing Company","South Burlington","VT","#9 (Magic Hat Brewing Company)" +"1254",1254,0.055,13,1113,"Elder Betty","Hefeweizen",303,12,NA,304,"Magic Hat Brewing Company","South Burlington","VT","Elder Betty (Magic Hat Brewing Company)" +"1255",1255,0.051,20,360,"#9","Fruit / Vegetable Beer",303,12,NA,304,"Magic Hat Brewing Company","South Burlington","VT","#9 (Magic Hat Brewing Company)" +"1256",1256,0.042,NA,511,"High Country Pilsner (Current)","German Pilsener",534,12,NA,535,"Mammoth Brewing Company","Mammoth Lakes","CA","High Country Pilsner (Current) (Mammoth Brewing Company)" +"1257",1257,0.065,NA,75,"Epic IPA","American IPA",534,12,"American IPA",535,"Mammoth Brewing Company","Mammoth Lakes","CA","Epic IPA (Mammoth Brewing Company)" +"1258",1258,0.042,NA,74,"Golden Trout Pilsner","German Pilsener",534,12,NA,535,"Mammoth Brewing Company","Mammoth Lakes","CA","Golden Trout Pilsner (Mammoth Brewing Company)" +"1259",1259,0.045,NA,73,"Real McCoy Amber Ale (Current)","American Amber / Red Ale",534,12,"American Amber / Red Ale",535,"Mammoth Brewing Company","Mammoth Lakes","CA","Real McCoy Amber Ale (Current) (Mammoth Brewing Company)" +"1260",1260,0.072,NA,1628,"Festivus (1)","Winter Warmer",356,12,NA,357,"Manayunk Brewing Company","Philadelphia","PA","Festivus (1) (Manayunk Brewing Company)" +"1261",1261,0.067,NA,1626,"Manayunk Oktoberfest","Märzen / Oktoberfest",356,12,NA,357,"Manayunk Brewing Company","Philadelphia","PA","Manayunk Oktoberfest (Manayunk Brewing Company)" +"1262",1262,0.045,21,1625,"Belgian Style Session Ale","Belgian Pale Ale",356,12,NA,357,"Manayunk Brewing Company","Philadelphia","PA","Belgian Style Session Ale (Manayunk Brewing Company)" +"1263",1263,0.055,NA,1624,"Manayunk IPA","American IPA",356,12,"American IPA",357,"Manayunk Brewing Company","Philadelphia","PA","Manayunk IPA (Manayunk Brewing Company)" +"1264",1264,0.055,NA,1600,"Yunkin' Punkin'","Pumpkin Ale",356,12,NA,357,"Manayunk Brewing Company","Philadelphia","PA","Yunkin' Punkin' (Manayunk Brewing Company)" +"1265",1265,0.05,18,1484,"Summer Paradise","American Pale Wheat Ale",356,12,"American Pale Wheat Ale",357,"Manayunk Brewing Company","Philadelphia","PA","Summer Paradise (Manayunk Brewing Company)" +"1266",1266,0.09,30,1356,"Monk from the 'Yunk","Tripel",356,12,NA,357,"Manayunk Brewing Company","Philadelphia","PA","Monk from the 'Yunk (Manayunk Brewing Company)" +"1267",1267,0.06,14,1355,"Schuylkill Punch","Fruit / Vegetable Beer",356,12,NA,357,"Manayunk Brewing Company","Philadelphia","PA","Schuylkill Punch (Manayunk Brewing Company)" +"1268",1268,0.085,85,1334,"Dreamin' Double IPA","American Double / Imperial IPA",356,12,"American Double / Imperial IPA",357,"Manayunk Brewing Company","Philadelphia","PA","Dreamin' Double IPA (Manayunk Brewing Company)" +"1269",1269,0.099,93,1674,"Chaotic Double IPA","American Double / Imperial IPA",346,12,"American Double / Imperial IPA",347,"Manzanita Brewing Company","Santee","CA","Chaotic Double IPA (Manzanita Brewing Company)" +"1270",1270,0.08,88,1673,"Manzanita IPA","American IPA",346,12,"American IPA",347,"Manzanita Brewing Company","Santee","CA","Manzanita IPA (Manzanita Brewing Company)" +"1271",1271,0.06,25,1672,"Riverwalk Blonde Ale","American Blonde Ale",346,12,"American Blonde Ale",347,"Manzanita Brewing Company","Santee","CA","Riverwalk Blonde Ale (Manzanita Brewing Company)" +"1272",1272,0.095,49,1671,"Gillespie Brown Ale","American Brown Ale",346,12,NA,347,"Manzanita Brewing Company","Santee","CA","Gillespie Brown Ale (Manzanita Brewing Company)" +"1273",1273,0.066,44,1670,"Manzanita Pale Ale","American Pale Ale (APA)",346,12,"American Pale Ale (APA)",347,"Manzanita Brewing Company","Santee","CA","Manzanita Pale Ale (Manzanita Brewing Company)" +"1274",1274,0.047,NA,1262,"Marble Pilsner","German Pilsener",443,12,NA,444,"Marble Brewery","Albuquerque","NM","Marble Pilsner (Marble Brewery)" +"1275",1275,0.062,NA,845,"Marble India Pale Ale","American IPA",443,12,"American IPA",444,"Marble Brewery","Albuquerque","NM","Marble India Pale Ale (Marble Brewery)" +"1276",1276,0.072,NA,1783,"Toughcats IPA","American IPA",317,16,"American IPA",318,"Marshall Wharf Brewing Company","Belfast","ME","Toughcats IPA (Marshall Wharf Brewing Company)" +"1277",1277,0.05,NA,1717,"Tug Pale Ale","American Pale Ale (APA)",317,16,"American Pale Ale (APA)",318,"Marshall Wharf Brewing Company","Belfast","ME","Tug Pale Ale (Marshall Wharf Brewing Company)" +"1278",1278,0.099,NA,1716,"Sexy Chaos","Russian Imperial Stout",317,16,NA,318,"Marshall Wharf Brewing Company","Belfast","ME","Sexy Chaos (Marshall Wharf Brewing Company)" +"1279",1279,0.063,NA,1516,"Ace Hole American Pale Ale","American Pale Ale (APA)",317,16,"American Pale Ale (APA)",318,"Marshall Wharf Brewing Company","Belfast","ME","Ace Hole American Pale Ale (Marshall Wharf Brewing Company)" +"1280",1280,0.0969999999999999,NA,725,"Cant Dog Imperial Pale Ale","American Double / Imperial IPA",317,16,"American Double / Imperial IPA",318,"Marshall Wharf Brewing Company","Belfast","ME","Cant Dog Imperial Pale Ale (Marshall Wharf Brewing Company)" +"1281",1281,0.05,20,2308,"River House","Saison / Farmhouse Ale",161,16,NA,162,"Martin House Brewing Company","Fort Worth","TX","River House (Martin House Brewing Company)" +"1282",1282,0.065,47,2268,"Pretzel Stout","American Stout",161,16,NA,162,"Martin House Brewing Company","Fort Worth","TX","Pretzel Stout (Martin House Brewing Company)" +"1283",1283,0.05,35,2197,"Rubberneck Red","American Amber / Red Ale",161,16,"American Amber / Red Ale",162,"Martin House Brewing Company","Fort Worth","TX","Rubberneck Red (Martin House Brewing Company)" +"1284",1284,0.08,NA,2120,"The Imperial Texan","American Double / Imperial IPA",161,16,"American Double / Imperial IPA",162,"Martin House Brewing Company","Fort Worth","TX","The Imperial Texan (Martin House Brewing Company)" +"1285",1285,0.08,NA,1234,"The Imperial Texan","American Double / Imperial IPA",161,12,"American Double / Imperial IPA",162,"Martin House Brewing Company","Fort Worth","TX","The Imperial Texan (Martin House Brewing Company)" +"1286",1286,0.05,NA,1233,"Day Break 4-Grain Breakfast Beer","Rye Beer",161,16,NA,162,"Martin House Brewing Company","Fort Worth","TX","Day Break 4-Grain Breakfast Beer (Martin House Brewing Company)" +"1287",1287,0.05,NA,1232,"River House Saison","Saison / Farmhouse Ale",161,12,NA,162,"Martin House Brewing Company","Fort Worth","TX","River House Saison (Martin House Brewing Company)" +"1288",1288,0.065,NA,1231,"There Will Be Stout","American Stout",161,12,NA,162,"Martin House Brewing Company","Fort Worth","TX","There Will Be Stout (Martin House Brewing Company)" +"1289",1289,0.065,60,1831,"Our Legacy IPA","American IPA",299,12,"American IPA",300,"Matt Brewing Company","Utica","NY","Our Legacy IPA (Matt Brewing Company)" +"1290",1290,0.042,NA,1359,"Saranac Shandy","Shandy",299,12,NA,300,"Matt Brewing Company","Utica","NY","Saranac Shandy (Matt Brewing Company)" +"1291",1291,0.065,60,1135,"Our Legacy IPA","American IPA",299,16,"American IPA",300,"Matt Brewing Company","Utica","NY","Our Legacy IPA (Matt Brewing Company)" +"1292",1292,0.051,NA,960,"Saranac Golden Pilsener (2003)","German Pilsener",299,12,NA,300,"Matt Brewing Company","Utica","NY","Saranac Golden Pilsener (2003) (Matt Brewing Company)" +"1293",1293,0.045,NA,959,"Saranac Adirondack Light (2002)","Light Lager",299,12,NA,300,"Matt Brewing Company","Utica","NY","Saranac Adirondack Light (2002) (Matt Brewing Company)" +"1294",1294,0.045,NA,958,"DAX Light (1998)","Light Lager",299,12,NA,300,"Matt Brewing Company","Utica","NY","DAX Light (1998) (Matt Brewing Company)" +"1295",1295,0.048,NA,957,"Saranac Traditional Lager (2000)","American Pale Lager",299,12,NA,300,"Matt Brewing Company","Utica","NY","Saranac Traditional Lager (2000) (Matt Brewing Company)" +"1296",1296,0.047,NA,956,"Pomegranate Wheat (2008)","Fruit / Vegetable Beer",299,12,NA,300,"Matt Brewing Company","Utica","NY","Pomegranate Wheat (2008) (Matt Brewing Company)" +"1297",1297,0.05,12,773,"Blueberry Blonde Ale","American Blonde Ale",299,12,"American Blonde Ale",300,"Matt Brewing Company","Utica","NY","Blueberry Blonde Ale (Matt Brewing Company)" +"1298",1298,0.06,NA,686,"Saranac White IPA","American IPA",299,12,"American IPA",300,"Matt Brewing Company","Utica","NY","Saranac White IPA (Matt Brewing Company)" +"1299",1299,0.047,NA,453,"Saranac Summer Ale (2011)","American Pale Wheat Ale",299,12,"American Pale Wheat Ale",300,"Matt Brewing Company","Utica","NY","Saranac Summer Ale (2011) (Matt Brewing Company)" +"1300",1300,0.055,NA,150,"Saranac Pale Ale (12 oz.)","English Pale Ale",299,12,NA,300,"Matt Brewing Company","Utica","NY","Saranac Pale Ale (12 oz.) (Matt Brewing Company)" +"1301",1301,0.055,NA,133,"Saranac Pale Ale (16 oz.)","English Pale Ale",299,16,NA,300,"Matt Brewing Company","Utica","NY","Saranac Pale Ale (16 oz.) (Matt Brewing Company)" +"1302",1302,0.051,20,1578,"Lahaina Town Brown","American Brown Ale",375,12,NA,376,"Maui Brewing Company","Lahaina","HI","Lahaina Town Brown (Maui Brewing Company)" +"1303",1303,0.055,NA,1429,"Pau Hana Pilsner","Czech Pilsener",375,12,NA,376,"Maui Brewing Company","Lahaina","HI","Pau Hana Pilsner (Maui Brewing Company)" +"1304",1304,0.05,NA,1271,"Lemongrass Saison","Saison / Farmhouse Ale",375,12,NA,376,"Maui Brewing Company","Lahaina","HI","Lemongrass Saison (Maui Brewing Company)" +"1305",1305,0.07,NA,713,"Aloha B’ak’tun","Belgian Strong Dark Ale",375,12,NA,376,"Maui Brewing Company","Lahaina","HI","Aloha B’ak’tun (Maui Brewing Company)" +"1306",1306,0.0819999999999999,NA,712,"Liquid Breadfruit","Fruit / Vegetable Beer",375,12,NA,376,"Maui Brewing Company","Lahaina","HI","Liquid Breadfruit (Maui Brewing Company)" +"1307",1307,0.06,24,690,"Sobrehumano Palena'ole","American Amber / Red Ale",375,12,"American Amber / Red Ale",376,"Maui Brewing Company","Lahaina","HI","Sobrehumano Palena'ole (Maui Brewing Company)" +"1308",1308,0.05,12,547,"La Perouse White","Witbier",375,12,NA,376,"Maui Brewing Company","Lahaina","HI","La Perouse White (Maui Brewing Company)" +"1309",1309,0.068,68,435,"Flyin' HI.P.Hay","American IPA",375,12,"American IPA",376,"Maui Brewing Company","Lahaina","HI","Flyin' HI.P.Hay (Maui Brewing Company)" +"1310",1310,0.055,15,313,"Mana Wheat","American Pale Wheat Ale",375,12,"American Pale Wheat Ale",376,"Maui Brewing Company","Lahaina","HI","Mana Wheat (Maui Brewing Company)" +"1311",1311,0.045,18,33,"Bikini Blonde Lager","Munich Helles Lager",375,12,NA,376,"Maui Brewing Company","Lahaina","HI","Bikini Blonde Lager (Maui Brewing Company)" +"1312",1312,0.057,30,32,"CoCoNut Porter","American Porter",375,12,NA,376,"Maui Brewing Company","Lahaina","HI","CoCoNut Porter (Maui Brewing Company)" +"1313",1313,0.062,65,31,"Big Swell IPA","American IPA",375,12,"American IPA",376,"Maui Brewing Company","Lahaina","HI","Big Swell IPA (Maui Brewing Company)" +"1314",1314,0.037,34,1237,"Pit Stop Chocolate Porter","American Porter",448,12,NA,449,"Mavericks Beer Company","Half Moon Bay","CA","Pit Stop Chocolate Porter (Mavericks Beer Company)" +"1315",1315,0.037,21,1236,"Pace Setter Belgian Style Wit","Witbier",448,12,NA,449,"Mavericks Beer Company","Half Moon Bay","CA","Pace Setter Belgian Style Wit (Mavericks Beer Company)" +"1316",1316,0.037,53,1047,"Back in the Saddle Rye Pale Ale","American Pale Ale (APA)",448,12,"American Pale Ale (APA)",449,"Mavericks Beer Company","Half Moon Bay","CA","Back in the Saddle Rye Pale Ale (Mavericks Beer Company)" +"1317",1317,0.069,NA,1986,"Bushwhacker Cider","Cider",254,16,NA,255,"Meckley's Cidery","Somerset Center","MI","Bushwhacker Cider (Meckley's Cidery)" +"1318",1318,0.069,NA,1985,"Weim-R-Iner","Cider",254,16,NA,255,"Meckley's Cidery","Somerset Center","MI","Weim-R-Iner (Meckley's Cidery)" +"1319",1319,0.069,NA,1984,"Cherry Bomb","Cider",254,16,NA,255,"Meckley's Cidery","Somerset Center","MI","Cherry Bomb (Meckley's Cidery)" +"1320",1320,0.072,75,2186,"Tsunami IPA","American IPA",203,19.2,"American IPA",204,"Mehana Brewing Co.","Hilo","HI","Tsunami IPA (Mehana Brewing Co.)" +"1321",1321,0.072,75,2185,"Tsunami IPA","American IPA",203,12,"American IPA",204,"Mehana Brewing Co.","Hilo","HI","Tsunami IPA (Mehana Brewing Co.)" +"1322",1322,0.042,22,2184,"Humpback Blonde Ale","American Blonde Ale",203,12,"American Blonde Ale",204,"Mehana Brewing Co.","Hilo","HI","Humpback Blonde Ale (Mehana Brewing Co.)" +"1323",1323,0.052,27,2178,"Hawaiian Crow Porter","American Porter",203,12,NA,204,"Mehana Brewing Co.","Hilo","HI","Hawaiian Crow Porter (Mehana Brewing Co.)" +"1324",1324,0.052,23,2177,"Volcano Red Ale","American Amber / Red Ale",203,12,"American Amber / Red Ale",204,"Mehana Brewing Co.","Hilo","HI","Volcano Red Ale (Mehana Brewing Co.)" +"1325",1325,0.054,42,2176,"Mauna Kea Pale Ale","American Pale Ale (APA)",203,12,"American Pale Ale (APA)",204,"Mehana Brewing Co.","Hilo","HI","Mauna Kea Pale Ale (Mehana Brewing Co.)" +"1326",1326,0.053,11,1508,"Shark Bait","Fruit / Vegetable Beer",393,12,NA,394,"Miami Brewing Company","Miami","FL","Shark Bait (Miami Brewing Company)" +"1327",1327,0.053,30,1507,"Gator Tail Brown Ale","American Brown Ale",393,12,NA,394,"Miami Brewing Company","Miami","FL","Gator Tail Brown Ale (Miami Brewing Company)" +"1328",1328,0.071,62,1506,"Miami Vice IPA","American IPA",393,12,"American IPA",394,"Miami Brewing Company","Miami","FL","Miami Vice IPA (Miami Brewing Company)" +"1329",1329,0.053,16,1325,"Big Rod Coconut Ale","American Blonde Ale",393,12,"American Blonde Ale",394,"Miami Brewing Company","Miami","FL","Big Rod Coconut Ale (Miami Brewing Company)" +"1330",1330,0.0559999999999999,NA,174,"Mickey Finn's Amber Ale","American Amber / Red Ale",552,12,"American Amber / Red Ale",553,"Mickey Finn's Brewery","Libertyville","IL","Mickey Finn's Amber Ale (Mickey Finn's Brewery)" +"1331",1331,0.063,61,2093,"Pleasure Town","American IPA",223,12,"American IPA",224,"Midnight Sun Brewing Company","Anchorage","AK","Pleasure Town (Midnight Sun Brewing Company)" +"1332",1332,0.063,61,1814,"Pleasure Town IPA","American IPA",223,12,"American IPA",224,"Midnight Sun Brewing Company","Anchorage","AK","Pleasure Town IPA (Midnight Sun Brewing Company)" +"1333",1333,0.048,12,587,"Snowshoe White Ale","Witbier",223,12,NA,224,"Midnight Sun Brewing Company","Anchorage","AK","Snowshoe White Ale (Midnight Sun Brewing Company)" +"1334",1334,0.05,24,586,"Kodiak Brown Ale","American Brown Ale",223,12,NA,224,"Midnight Sun Brewing Company","Anchorage","AK","Kodiak Brown Ale (Midnight Sun Brewing Company)" +"1335",1335,0.057,70,434,"Sockeye Red IPA","American IPA",223,12,"American IPA",224,"Midnight Sun Brewing Company","Anchorage","AK","Sockeye Red IPA (Midnight Sun Brewing Company)" +"1336",1336,0.08,100,2668,"Habitus (2014)","American Double / Imperial IPA",3,16,"American Double / Imperial IPA",4,"Mike Hess Brewing Company","San Diego","CA","Habitus (2014) (Mike Hess Brewing Company)" +"1337",1337,0.075,85,2667,"Solis","American IPA",3,16,"American IPA",4,"Mike Hess Brewing Company","San Diego","CA","Solis (Mike Hess Brewing Company)" +"1338",1338,0.06,24,2666,"Jucundus","Wheat Ale",3,16,NA,4,"Mike Hess Brewing Company","San Diego","CA","Jucundus (Mike Hess Brewing Company)" +"1339",1339,0.08,100,2664,"Habitus","American Double / Imperial IPA",3,16,"American Double / Imperial IPA",4,"Mike Hess Brewing Company","San Diego","CA","Habitus (Mike Hess Brewing Company)" +"1340",1340,0.063,30,2663,"Grazias","Cream Ale",3,16,NA,4,"Mike Hess Brewing Company","San Diego","CA","Grazias (Mike Hess Brewing Company)" +"1341",1341,0.0579999999999999,28,2662,"Claritas","Kölsch",3,16,NA,4,"Mike Hess Brewing Company","San Diego","CA","Claritas (Mike Hess Brewing Company)" +"1342",1342,0.083,NA,2535,"Vinyl Frontier","American Double / Imperial IPA",65,24,"American Double / Imperial IPA",66,"Mikerphone Brewing","Chicago","IL","Vinyl Frontier (Mikerphone Brewing)" +"1343",1343,0.08,NA,2534,"Disco Superfly","American IPA",65,24,"American IPA",66,"Mikerphone Brewing","Chicago","IL","Disco Superfly (Mikerphone Brewing)" +"1344",1344,0.075,NA,2533,"Misty Mountain Hop","American IPA",65,24,"American IPA",66,"Mikerphone Brewing","Chicago","IL","Misty Mountain Hop (Mikerphone Brewing)" +"1345",1345,0.075,NA,2532,"One-Hit Wonderful","Belgian IPA",65,24,NA,66,"Mikerphone Brewing","Chicago","IL","One-Hit Wonderful (Mikerphone Brewing)" +"1346",1346,0.065,NA,2531,"En Parfaite Harmonie","Saison / Farmhouse Ale",65,24,NA,66,"Mikerphone Brewing","Chicago","IL","En Parfaite Harmonie (Mikerphone Brewing)" +"1347",1347,0.043,8,2530,"Daft Funk","Berliner Weissbier",65,24,NA,66,"Mikerphone Brewing","Chicago","IL","Daft Funk (Mikerphone Brewing)" +"1348",1348,0.075,NA,2529,"Love In An Ellavator","American IPA",65,24,"American IPA",66,"Mikerphone Brewing","Chicago","IL","Love In An Ellavator (Mikerphone Brewing)" +"1349",1349,0.053,NA,2528,"Spin Doctor","American Pale Ale (APA)",65,24,"American Pale Ale (APA)",66,"Mikerphone Brewing","Chicago","IL","Spin Doctor (Mikerphone Brewing)" +"1350",1350,0.05,NA,1612,"Keeper (Current)","American Pilsner",363,12,NA,364,"Mikkeller","Pottstown","PA","Keeper (Current) (Mikkeller)" +"1351",1351,0.068,NA,1611,"Better Half","American IPA",363,12,"American IPA",364,"Mikkeller","Pottstown","PA","Better Half (Mikkeller)" +"1352",1352,0.048,NA,1273,"SNO White Ale","Witbier",440,16,NA,441,"MillKing It Productions","Royal Oak","MI","SNO White Ale (MillKing It Productions)" +"1353",1353,0.048,NA,365,"BRIK Irish Red Ale","Irish Red Ale",440,16,NA,441,"MillKing It Productions","Royal Oak","MI","BRIK Irish Red Ale (MillKing It Productions)" +"1354",1354,NA,NA,273,"AXL Pale Ale","American Pale Ale (APA)",440,16,"American Pale Ale (APA)",441,"MillKing It Productions","Royal Oak","MI","AXL Pale Ale (MillKing It Productions)" +"1355",1355,0.087,80,1884,"Hop Freak","American Double / Imperial IPA",284,16,"American Double / Imperial IPA",285,"Milwaukee Brewing Company","Milwaukee","WI","Hop Freak (Milwaukee Brewing Company)" +"1356",1356,0.051,24,1272,"Louie's Demise Amber Ale","American Amber / Red Ale",284,16,"American Amber / Red Ale",285,"Milwaukee Brewing Company","Milwaukee","WI","Louie's Demise Amber Ale (Milwaukee Brewing Company)" +"1357",1357,0.075,51,1080,"Hop Happy","American IPA",284,16,"American IPA",285,"Milwaukee Brewing Company","Milwaukee","WI","Hop Happy (Milwaukee Brewing Company)" +"1358",1358,0.065,20,932,"Booyah Farmhouse Ale","Saison / Farmhouse Ale",284,16,NA,285,"Milwaukee Brewing Company","Milwaukee","WI","Booyah Farmhouse Ale (Milwaukee Brewing Company)" +"1359",1359,0.092,NA,776,"O-Gii","Witbier",284,16,NA,285,"Milwaukee Brewing Company","Milwaukee","WI","O-Gii (Milwaukee Brewing Company)" +"1360",1360,0.048,18,172,"Flaming Damsel Lager (2010)","Vienna Lager",284,16,NA,285,"Milwaukee Brewing Company","Milwaukee","WI","Flaming Damsel Lager (2010) (Milwaukee Brewing Company)" +"1361",1361,0.051,24,171,"Louie’s Demise Immort-Ale (2010)","American Amber / Red Ale",284,16,"American Amber / Red Ale",285,"Milwaukee Brewing Company","Milwaukee","WI","Louie’s Demise Immort-Ale (2010) (Milwaukee Brewing Company)" +"1362",1362,0.099,NA,2361,"Axe Head Malt Liquor","American Malt Liquor",134,24,NA,135,"Minhas Craft Brewery","Monroe","WI","Axe Head Malt Liquor (Minhas Craft Brewery)" +"1363",1363,0.054,NA,2359,"Huber Bock (2014)","Bock",134,16,NA,135,"Minhas Craft Brewery","Monroe","WI","Huber Bock (2014) (Minhas Craft Brewery)" +"1364",1364,0.04,NA,2358,"Minhas Light (2012)","Light Lager",134,12,NA,135,"Minhas Craft Brewery","Monroe","WI","Minhas Light (2012) (Minhas Craft Brewery)" +"1365",1365,0.05,NA,2282,"Huber","American Pale Lager",134,12,NA,135,"Minhas Craft Brewery","Monroe","WI","Huber (Minhas Craft Brewery)" +"1366",1366,0.062,NA,2281,"Clear Creek Ice","American Pale Lager",134,16,NA,135,"Minhas Craft Brewery","Monroe","WI","Clear Creek Ice (Minhas Craft Brewery)" +"1367",1367,0.062,NA,2280,"Clear Creek Ice","American Pale Lager",134,12,NA,135,"Minhas Craft Brewery","Monroe","WI","Clear Creek Ice (Minhas Craft Brewery)" +"1368",1368,0.055,NA,2279,"Mountain Crest","American Pale Lager",134,16,NA,135,"Minhas Craft Brewery","Monroe","WI","Mountain Crest (Minhas Craft Brewery)" +"1369",1369,0.055,NA,2278,"Mountain Crest","American Pale Lager",134,12,NA,135,"Minhas Craft Brewery","Monroe","WI","Mountain Crest (Minhas Craft Brewery)" +"1370",1370,0.055,NA,2277,"Mountain Creek (2013)","American Pale Lager",134,12,NA,135,"Minhas Craft Brewery","Monroe","WI","Mountain Creek (2013) (Minhas Craft Brewery)" +"1371",1371,0.05,NA,2276,"Boxer","American Adjunct Lager",134,24,NA,135,"Minhas Craft Brewery","Monroe","WI","Boxer (Minhas Craft Brewery)" +"1372",1372,0.042,NA,2275,"Boxer Light","Light Lager",134,12,NA,135,"Minhas Craft Brewery","Monroe","WI","Boxer Light (Minhas Craft Brewery)" +"1373",1373,0.055,NA,2274,"Boxer Ice","American Adjunct Lager",134,12,NA,135,"Minhas Craft Brewery","Monroe","WI","Boxer Ice (Minhas Craft Brewery)" +"1374",1374,0.05,NA,2273,"Boxer","American Adjunct Lager",134,12,NA,135,"Minhas Craft Brewery","Monroe","WI","Boxer (Minhas Craft Brewery)" +"1375",1375,0.05,NA,2442,"Cortez Gold","Belgian Pale Ale",98,32,NA,99,"Mission Brewery","San Diego","CA","Cortez Gold (Mission Brewery)" +"1376",1376,0.068,66,2441,"Mission IPA","American IPA",98,32,"American IPA",99,"Mission Brewery","San Diego","CA","Mission IPA (Mission Brewery)" +"1377",1377,0.048,44,1460,"El Conquistador Extra Pale Ale","American Pale Ale (APA)",98,32,"American Pale Ale (APA)",99,"Mission Brewery","San Diego","CA","El Conquistador Extra Pale Ale (Mission Brewery)" +"1378",1378,0.092,75,1459,"Shipwrecked Double IPA","American Double / Imperial IPA",98,32,"American Double / Imperial IPA",99,"Mission Brewery","San Diego","CA","Shipwrecked Double IPA (Mission Brewery)" +"1379",1379,0.04,NA,1476,"Squeaky Bike Nut Brown Ale","American Brown Ale",399,16,NA,400,"Moab Brewery","Moab","UT","Squeaky Bike Nut Brown Ale (Moab Brewery)" +"1380",1380,0.04,NA,902,"Dead Horse Amber","American Pale Wheat Ale",399,16,"American Pale Wheat Ale",400,"Moab Brewery","Moab","UT","Dead Horse Amber (Moab Brewery)" +"1381",1381,0.04,NA,645,"Rocket Bike American Lager","California Common / Steam Beer",399,16,NA,400,"Moab Brewery","Moab","UT","Rocket Bike American Lager (Moab Brewery)" +"1382",1382,0.04,NA,644,"Johnny's American IPA","American IPA",399,16,"American IPA",400,"Moab Brewery","Moab","UT","Johnny's American IPA (Moab Brewery)" +"1383",1383,0.055,NA,337,"Boneshaker Brown Ale","English Brown Ale",547,24,NA,548,"Moat Mountain Smoke House & Brew...","North Conway","NH","Boneshaker Brown Ale (Moat Mountain Smoke House & Brew...)" +"1384",1384,0.0559999999999999,NA,336,"Iron Mike Pale Ale","American Pale Ale (APA)",547,24,"American Pale Ale (APA)",548,"Moat Mountain Smoke House & Brew...","North Conway","NH","Iron Mike Pale Ale (Moat Mountain Smoke House & Brew...)" +"1385",1385,0.042,NA,2236,"Monkadelic","American Pale Ale (APA)",189,12,"American Pale Ale (APA)",190,"Modern Monks Brewery","Lincoln","NE","Monkadelic (Modern Monks Brewery)" +"1386",1386,0.075,85,2159,"City of the Sun","American IPA",209,16,"American IPA",210,"Modern Times Beer","San Diego","CA","City of the Sun (Modern Times Beer)" +"1387",1387,0.068,75,2157,"Booming Rollers","American IPA",209,16,"American IPA",210,"Modern Times Beer","San Diego","CA","Booming Rollers (Modern Times Beer)" +"1388",1388,0.052,50,2156,"Oneida","American Pale Ale (APA)",209,16,"American Pale Ale (APA)",210,"Modern Times Beer","San Diego","CA","Oneida (Modern Times Beer)" +"1389",1389,0.067,75,2154,"Aurora","American Amber / Red Ale",209,16,"American Amber / Red Ale",210,"Modern Times Beer","San Diego","CA","Aurora (Modern Times Beer)" +"1390",1390,0.055,30,1495,"Lomaland","Saison / Farmhouse Ale",209,16,NA,210,"Modern Times Beer","San Diego","CA","Lomaland (Modern Times Beer)" +"1391",1391,0.047,46,1494,"Fortunate Islands","American Pale Wheat Ale",209,16,"American Pale Wheat Ale",210,"Modern Times Beer","San Diego","CA","Fortunate Islands (Modern Times Beer)" +"1392",1392,0.0579999999999999,40,1493,"Black House","American Stout",209,16,NA,210,"Modern Times Beer","San Diego","CA","Black House (Modern Times Beer)" +"1393",1393,0.065,115,1492,"Blazing World","American Amber / Red Ale",209,16,"American Amber / Red Ale",210,"Modern Times Beer","San Diego","CA","Blazing World (Modern Times Beer)" +"1394",1394,0.05,NA,327,"Wapiti Amber Ale","American Amber / Red Ale",549,12,"American Amber / Red Ale",550,"Mogollon Brewing Company","Flagstaff","AZ","Wapiti Amber Ale (Mogollon Brewing Company)" +"1395",1395,0.054,NA,719,"Sweet Georgia Brown","American Brown Ale",514,16,NA,515,"Monkey Paw Pub & Brewery","San Diego","CA","Sweet Georgia Brown (Monkey Paw Pub & Brewery)" +"1396",1396,0.087,NA,718,"Rich Man's IIPA","American Double / Imperial IPA",514,16,"American Double / Imperial IPA",515,"Monkey Paw Pub & Brewery","San Diego","CA","Rich Man's IIPA (Monkey Paw Pub & Brewery)" +"1397",1397,0.0579999999999999,NA,717,"Monkey Paw Oatmeal Pale Ale","American Pale Ale (APA)",514,16,"American Pale Ale (APA)",515,"Monkey Paw Pub & Brewery","San Diego","CA","Monkey Paw Oatmeal Pale Ale (Monkey Paw Pub & Brewery)" +"1398",1398,0.0559999999999999,28,1907,"Montauk Summer Ale","American Blonde Ale",276,12,"American Blonde Ale",277,"Montauk Brewing Company","Montauk","NY","Montauk Summer Ale (Montauk Brewing Company)" +"1399",1399,0.06,49,1906,"Driftwood Ale","Extra Special / Strong Bitter (ESB)",276,12,NA,277,"Montauk Brewing Company","Montauk","NY","Driftwood Ale (Montauk Brewing Company)" +"1400",1400,0.0559999999999999,18,1756,"When Helles Freezes Over","Munich Helles Lager",326,12,NA,327,"Morgan Street Brewery","Saint Louis","MO","When Helles Freezes Over (Morgan Street Brewery)" +"1401",1401,0.049,24,1617,"Morgan Street Oktoberfest","Märzen / Oktoberfest",326,12,NA,327,"Morgan Street Brewery","Saint Louis","MO","Morgan Street Oktoberfest (Morgan Street Brewery)" +"1402",1402,0.047,14,1052,"Honey Wheat","American Pale Wheat Ale",326,12,"American Pale Wheat Ale",327,"Morgan Street Brewery","Saint Louis","MO","Honey Wheat (Morgan Street Brewery)" +"1403",1403,0.046,24,1051,"Black Bear Dark Lager","Schwarzbier",326,12,NA,327,"Morgan Street Brewery","Saint Louis","MO","Black Bear Dark Lager (Morgan Street Brewery)" +"1404",1404,0.05,35,1046,"Golden Pilsner","German Pilsener",326,12,NA,327,"Morgan Street Brewery","Saint Louis","MO","Golden Pilsner (Morgan Street Brewery)" +"1405",1405,0.052,21,2413,"Cali Creamin'","Cream Ale",111,12,NA,112,"Mother Earth Brew Company","Vista","CA","Cali Creamin' (Mother Earth Brew Company)" +"1406",1406,0.05,NA,419,"Second Wind Pale Ale","American Pale Ale (APA)",540,12,"American Pale Ale (APA)",541,"Mother Earth Brewing Company","Kinston","NC","Second Wind Pale Ale (Mother Earth Brewing Company)" +"1407",1407,0.05,NA,408,"Sunny Haze","Hefeweizen",540,12,NA,541,"Mother Earth Brewing Company","Kinston","NC","Sunny Haze (Mother Earth Brewing Company)" +"1408",1408,0.052,21,2237,"Towhead","American Blonde Ale",188,12,"American Blonde Ale",189,"Mother's Brewing","Springfield","MO","Towhead (Mother's Brewing)" +"1409",1409,0.07,70,2208,"Lil' Helper","American IPA",188,12,"American IPA",189,"Mother's Brewing","Springfield","MO","Lil' Helper (Mother's Brewing)" +"1410",1410,0.0819999999999999,NA,1952,"Train Wreck","American Amber / Red Ale",260,16,"American Amber / Red Ale",261,"Mountain Town Brewing Company","Mount Pleasant","MI","Train Wreck (Mountain Town Brewing Company)" +"1411",1411,0.085,NA,768,"Full Moon Belgian White Ale","Witbier",507,12,NA,508,"Mudshark Brewing Company","Lake Havasu City","AZ","Full Moon Belgian White Ale (Mudshark Brewing Company)" +"1412",1412,0.072,NA,625,"Desert Magic IPA","American IPA",507,12,"American IPA",508,"Mudshark Brewing Company","Lake Havasu City","AZ","Desert Magic IPA (Mudshark Brewing Company)" +"1413",1413,0.042,NA,326,"Up River Light","Light Lager",507,12,NA,508,"Mudshark Brewing Company","Lake Havasu City","AZ","Up River Light (Mudshark Brewing Company)" +"1414",1414,0.085,NA,132,"Full Moon Belgian White Ale (2007)","Witbier",507,12,NA,508,"Mudshark Brewing Company","Lake Havasu City","AZ","Full Moon Belgian White Ale (2007) (Mudshark Brewing Company)" +"1415",1415,0.055,NA,131,"Dry Heat Hefeweizen (2006)","Hefeweizen",507,12,NA,508,"Mudshark Brewing Company","Lake Havasu City","AZ","Dry Heat Hefeweizen (2006) (Mudshark Brewing Company)" +"1416",1416,0.05,NA,1598,"Mustang Sixty-Six","American Amber / Red Lager",366,12,NA,367,"Mustang Brewing Company","Mustang","OK","Mustang Sixty-Six (Mustang Brewing Company)" +"1417",1417,0.04,NA,862,"Mustang '33","American Pale Lager",366,12,NA,367,"Mustang Brewing Company","Mustang","OK","Mustang '33 (Mustang Brewing Company)" +"1418",1418,0.04,NA,699,"Session '33 (2011)","American Pale Lager",366,12,NA,367,"Mustang Brewing Company","Mustang","OK","Session '33 (2011) (Mustang Brewing Company)" +"1419",1419,0.053,10,421,"Mustang Golden Ale","American Blonde Ale",366,12,"American Blonde Ale",367,"Mustang Brewing Company","Mustang","OK","Mustang Golden Ale (Mustang Brewing Company)" +"1420",1420,0.053,14,420,"Washita Wheat","American Pale Wheat Ale",366,12,"American Pale Wheat Ale",367,"Mustang Brewing Company","Mustang","OK","Washita Wheat (Mustang Brewing Company)" +"1421",1421,0.037,10,2345,"Gansett Light","Light Lager",143,16,NA,144,"Narragansett Brewing Company","Providence","RI","Gansett Light (Narragansett Brewing Company)" +"1422",1422,0.052,30,2224,"Bohemian Pils","American Pilsner",143,16,NA,144,"Narragansett Brewing Company","Providence","RI","Bohemian Pils (Narragansett Brewing Company)" +"1423",1423,0.053,30,1775,"Autocrat Coffee Milk Stout","Milk / Sweet Stout",143,16,NA,144,"Narragansett Brewing Company","Providence","RI","Autocrat Coffee Milk Stout (Narragansett Brewing Company)" +"1424",1424,0.086,35,1291,"Narragansett Bohemian Pilsner","German Pilsener",143,16,NA,144,"Narragansett Brewing Company","Providence","RI","Narragansett Bohemian Pilsner (Narragansett Brewing Company)" +"1425",1425,0.042,24,1093,"Narragansett Summer Ale","American Pale Wheat Ale",143,12,"American Pale Wheat Ale",144,"Narragansett Brewing Company","Providence","RI","Narragansett Summer Ale (Narragansett Brewing Company)" +"1426",1426,0.05,22,580,"Narragansett Cream Ale","Cream Ale",143,16,NA,144,"Narragansett Brewing Company","Providence","RI","Narragansett Cream Ale (Narragansett Brewing Company)" +"1427",1427,0.042,24,403,"Narragansett Summer Ale","American Pale Wheat Ale",143,16,"American Pale Wheat Ale",144,"Narragansett Brewing Company","Providence","RI","Narragansett Summer Ale (Narragansett Brewing Company)" +"1428",1428,0.07,22,316,"Narragansett Porter","American Porter",143,16,NA,144,"Narragansett Brewing Company","Providence","RI","Narragansett Porter (Narragansett Brewing Company)" +"1429",1429,0.065,32,315,"Narragansett Bock","Bock",143,16,NA,144,"Narragansett Brewing Company","Providence","RI","Narragansett Bock (Narragansett Brewing Company)" +"1430",1430,0.055,15,314,"Narragansett Fest Lager","Märzen / Oktoberfest",143,16,NA,144,"Narragansett Brewing Company","Providence","RI","Narragansett Fest Lager (Narragansett Brewing Company)" +"1431",1431,0.053,NA,1537,"Undun Blonde Ale","American Blonde Ale",387,16,"American Blonde Ale",388,"Natian Brewery","Portland","OR","Undun Blonde Ale (Natian Brewery)" +"1432",1432,0.074,NA,1536,"CuDa Cascadian Dark Ale","American Black Ale",387,16,NA,388,"Natian Brewery","Portland","OR","CuDa Cascadian Dark Ale (Natian Brewery)" +"1433",1433,0.085,86,1265,"Old Grogham Imperial India Pale Ale","American Double / Imperial IPA",387,16,"American Double / Imperial IPA",388,"Natian Brewery","Portland","OR","Old Grogham Imperial India Pale Ale (Natian Brewery)" +"1434",1434,0.085,86,747,"Old Grogham Imperial India Pale Ale (2012)","American Double / Imperial IPA",387,16,"American Double / Imperial IPA",388,"Natian Brewery","Portland","OR","Old Grogham Imperial India Pale Ale (2012) (Natian Brewery)" +"1435",1435,0.074,NA,746,"CuDa Cascadian Dark Ale (2012)","American Black Ale",387,16,NA,388,"Natian Brewery","Portland","OR","CuDa Cascadian Dark Ale (2012) (Natian Brewery)" +"1436",1436,0.053,NA,654,"Undun Blonde Ale (2012)","American Blonde Ale",387,16,"American Blonde Ale",388,"Natian Brewery","Portland","OR","Undun Blonde Ale (2012) (Natian Brewery)" +"1437",1437,0.061,11,1705,"Wick For Brains","Pumpkin Ale",337,12,NA,338,"Nebraska Brewing Company","Papillion","NE","Wick For Brains (Nebraska Brewing Company)" +"1438",1438,0.065,65,1148,"Nebraska India Pale Ale","American IPA",337,12,"American IPA",338,"Nebraska Brewing Company","Papillion","NE","Nebraska India Pale Ale (Nebraska Brewing Company)" +"1439",1439,0.048,10,1147,"EOS Hefeweizen","Hefeweizen",337,12,NA,338,"Nebraska Brewing Company","Papillion","NE","EOS Hefeweizen (Nebraska Brewing Company)" +"1440",1440,0.048,15,1146,"Brunette Nut Brown Ale","English Brown Ale",337,12,NA,338,"Nebraska Brewing Company","Papillion","NE","Brunette Nut Brown Ale (Nebraska Brewing Company)" +"1441",1441,0.057,29,1145,"Cardinal Pale Ale","American Pale Ale (APA)",337,12,"American Pale Ale (APA)",338,"Nebraska Brewing Company","Papillion","NE","Cardinal Pale Ale (Nebraska Brewing Company)" +"1442",1442,0.066,NA,1758,"County Line IPA","American IPA",325,12,"American IPA",326,"Neshaminy Creek Brewing Company","Croydon","PA","County Line IPA (Neshaminy Creek Brewing Company)" +"1443",1443,0.048,NA,1757,"Trauger Pilsner","German Pilsener",325,12,NA,326,"Neshaminy Creek Brewing Company","Croydon","PA","Trauger Pilsner (Neshaminy Creek Brewing Company)" +"1444",1444,0.045,40,2475,"Slow Ride","American IPA",82,12,"American IPA",83,"New Belgium Brewing Company","Fort Collins","CO","Slow Ride (New Belgium Brewing Company)" +"1445",1445,0.065,70,2230,"Ranger IPA","American IPA",82,12,"American IPA",83,"New Belgium Brewing Company","Fort Collins","CO","Ranger IPA (New Belgium Brewing Company)" +"1446",1446,0.05,29,1987,"Shift","American Pale Lager",82,12,NA,83,"New Belgium Brewing Company","Fort Collins","CO","Shift (New Belgium Brewing Company)" +"1447",1447,0.0559999999999999,21,1978,"1554 Black Lager","Euro Dark Lager",82,12,NA,83,"New Belgium Brewing Company","Fort Collins","CO","1554 Black Lager (New Belgium Brewing Company)" +"1448",1448,0.048,NA,1975,"Blue Paddle","Czech Pilsener",82,12,NA,83,"New Belgium Brewing Company","Fort Collins","CO","Blue Paddle (New Belgium Brewing Company)" +"1449",1449,0.055,NA,1737,"California Route","American Amber / Red Lager",82,12,NA,83,"New Belgium Brewing Company","Fort Collins","CO","California Route (New Belgium Brewing Company)" +"1450",1450,0.052,NA,1707,"Snapshot","American Pale Wheat Ale",82,16,"American Pale Wheat Ale",83,"New Belgium Brewing Company","Fort Collins","CO","Snapshot (New Belgium Brewing Company)" +"1451",1451,0.048,NA,1690,"Sunshine Wheat Beer","American Pale Wheat Ale",82,12,"American Pale Wheat Ale",83,"New Belgium Brewing Company","Fort Collins","CO","Sunshine Wheat Beer (New Belgium Brewing Company)" +"1452",1452,0.052,18,1586,"Fat Tire Amber Ale","American Amber / Red Ale",82,12,"American Amber / Red Ale",83,"New Belgium Brewing Company","Fort Collins","CO","Fat Tire Amber Ale (New Belgium Brewing Company)" +"1453",1453,0.05,29,952,"Shift (1)","American Pale Lager",82,12,NA,83,"New Belgium Brewing Company","Fort Collins","CO","Shift (1) (New Belgium Brewing Company)" +"1454",1454,0.052,18,748,"Fat Tire Amber Ale (2011)","American Amber / Red Ale",82,12,"American Amber / Red Ale",83,"New Belgium Brewing Company","Fort Collins","CO","Fat Tire Amber Ale (2011) (New Belgium Brewing Company)" +"1455",1455,0.05,29,578,"Shift","American Pale Lager",82,16,NA,83,"New Belgium Brewing Company","Fort Collins","CO","Shift (New Belgium Brewing Company)" +"1456",1456,0.065,70,564,"Ranger IPA","American IPA",82,16,"American IPA",83,"New Belgium Brewing Company","Fort Collins","CO","Ranger IPA (New Belgium Brewing Company)" +"1457",1457,0.052,18,563,"Fat Tire Amber Ale","American Amber / Red Ale",82,16,"American Amber / Red Ale",83,"New Belgium Brewing Company","Fort Collins","CO","Fat Tire Amber Ale (New Belgium Brewing Company)" +"1458",1458,0.065,70,115,"Ranger IPA (Current)","American IPA",82,12,"American IPA",83,"New Belgium Brewing Company","Fort Collins","CO","Ranger IPA (Current) (New Belgium Brewing Company)" +"1459",1459,0.048,NA,72,"Sunshine Wheat Beer (2009)","American Pale Wheat Ale",82,12,"American Pale Wheat Ale",83,"New Belgium Brewing Company","Fort Collins","CO","Sunshine Wheat Beer (2009) (New Belgium Brewing Company)" +"1460",1460,0.052,18,71,"Fat Tire Amber Ale (2008)","American Amber / Red Ale",82,12,"American Amber / Red Ale",83,"New Belgium Brewing Company","Fort Collins","CO","Fat Tire Amber Ale (2008) (New Belgium Brewing Company)" +"1461",1461,0.034,6,1417,"Weiss Trash Culture","Berliner Weissbier",410,12,NA,411,"New England Brewing Company","Woodbridge","CT","Weiss Trash Culture (New England Brewing Company)" +"1462",1462,0.062,NA,885,"Sea Hag IPA","American IPA",410,12,"American IPA",411,"New England Brewing Company","Woodbridge","CT","Sea Hag IPA (New England Brewing Company)" +"1463",1463,0.05,NA,884,"Elm City Pilsner","American Pilsner",410,12,NA,411,"New England Brewing Company","Woodbridge","CT","Elm City Pilsner (New England Brewing Company)" +"1464",1464,0.05,NA,757,"Atlantic Amber Ale (2004)","American Amber / Red Ale",410,12,"American Amber / Red Ale",411,"New England Brewing Company","Woodbridge","CT","Atlantic Amber Ale (2004) (New England Brewing Company)" +"1465",1465,0.09,NA,568,"668 Neighbor of the Beast12 oz.","Belgian Pale Ale",410,12,NA,411,"New England Brewing Company","Woodbridge","CT","668 Neighbor of the Beast12 oz. (New England Brewing Company)" +"1466",1466,0.088,85,320,"Gandhi-Bot Double IPA (12 oz.)","American Double / Imperial IPA",410,12,"American Double / Imperial IPA",411,"New England Brewing Company","Woodbridge","CT","Gandhi-Bot Double IPA (12 oz.) (New England Brewing Company)" +"1467",1467,0.09,NA,43,"668 Neighbor of the Beast (16 oz.) (2010)","Belgian Pale Ale",410,16,NA,411,"New England Brewing Company","Woodbridge","CT","668 Neighbor of the Beast (16 oz.) (2010) (New England Brewing Company)" +"1468",1468,0.088,85,42,"Gandhi-Bot Double IPA (16 oz.) (2010)","American Double / Imperial IPA",410,16,"American Double / Imperial IPA",411,"New England Brewing Company","Woodbridge","CT","Gandhi-Bot Double IPA (16 oz.) (2010) (New England Brewing Company)" +"1469",1469,0.05,NA,41,"Elm City Lager (2007)","American Pilsner",410,12,NA,411,"New England Brewing Company","Woodbridge","CT","Elm City Lager (2007) (New England Brewing Company)" +"1470",1470,0.05,NA,40,"Atlantic Amber Ale (2007)","American Amber / Red Ale",410,12,"American Amber / Red Ale",411,"New England Brewing Company","Woodbridge","CT","Atlantic Amber Ale (2007) (New England Brewing Company)" +"1471",1471,0.062,NA,39,"Sea Hag IPA (Current)","American IPA",410,12,"American IPA",411,"New England Brewing Company","Woodbridge","CT","Sea Hag IPA (Current) (New England Brewing Company)" +"1472",1472,0.05,NA,2272,"Rebirth Pale Ale","American Pale Ale (APA)",174,12,"American Pale Ale (APA)",175,"New Orleans Lager & Ale Brewing ...","New Orleans","LA","Rebirth Pale Ale (New Orleans Lager & Ale Brewing ...)" +"1473",1473,0.068,NA,1582,"Irish Channel Stout","American Stout",174,16,NA,175,"New Orleans Lager & Ale Brewing ...","New Orleans","LA","Irish Channel Stout (New Orleans Lager & Ale Brewing ...)" +"1474",1474,0.088,NA,1114,"MechaHopzilla","American Double / Imperial IPA",174,16,"American Double / Imperial IPA",175,"New Orleans Lager & Ale Brewing ...","New Orleans","LA","MechaHopzilla (New Orleans Lager & Ale Brewing ...)" +"1475",1475,0.065,NA,486,"Hopitoulas IPA","American IPA",174,16,"American IPA",175,"New Orleans Lager & Ale Brewing ...","New Orleans","LA","Hopitoulas IPA (New Orleans Lager & Ale Brewing ...)" +"1476",1476,0.039,NA,485,"NOLA Brown Ale","English Dark Mild Ale",174,12,NA,175,"New Orleans Lager & Ale Brewing ...","New Orleans","LA","NOLA Brown Ale (New Orleans Lager & Ale Brewing ...)" +"1477",1477,0.049,NA,484,"NOLA Blonde Ale","American Blonde Ale",174,12,"American Blonde Ale",175,"New Orleans Lager & Ale Brewing ...","New Orleans","LA","NOLA Blonde Ale (New Orleans Lager & Ale Brewing ...)" +"1478",1478,0.0559999999999999,20,2043,"Skylight","Dunkelweizen",241,12,NA,242,"New Republic Brewing Company","College Station","TX","Skylight (New Republic Brewing Company)" +"1479",1479,0.0559999999999999,30,2042,"Kadigan","American Blonde Ale",241,12,"American Blonde Ale",242,"New Republic Brewing Company","College Station","TX","Kadigan (New Republic Brewing Company)" +"1480",1480,0.052,50,2041,"Dammit Jim!","American Amber / Red Ale",241,12,"American Amber / Red Ale",242,"New Republic Brewing Company","College Station","TX","Dammit Jim! (New Republic Brewing Company)" +"1481",1481,0.054,NA,646,"Nut Brown Ale","English Brown Ale",518,12,NA,519,"New South Brewing Company","Myrtle Beach","SC","Nut Brown Ale (New South Brewing Company)" +"1482",1482,0.046,NA,165,"White Ale","Witbier",518,12,NA,519,"New South Brewing Company","Myrtle Beach","SC","White Ale (New South Brewing Company)" +"1483",1483,0.042,35,2050,"Cream Ale","Cream Ale",238,12,NA,239,"Newburgh Brewing Company","Newburgh","NY","Cream Ale (Newburgh Brewing Company)" +"1484",1484,0.072,NA,915,"Green Head IPA","American IPA",495,12,"American IPA",496,"Newburyport Brewing Company","Newburyport","MA","Green Head IPA (Newburyport Brewing Company)" +"1485",1485,0.054,NA,914,"Plum Island Belgian White","Witbier",495,12,NA,496,"Newburyport Brewing Company","Newburyport","MA","Plum Island Belgian White (Newburyport Brewing Company)" +"1486",1486,0.055,NA,913,"Newburyport Pale Ale","American Pale Ale (APA)",495,12,"American Pale Ale (APA)",496,"Newburyport Brewing Company","Newburyport","MA","Newburyport Pale Ale (Newburyport Brewing Company)" +"1487",1487,0.055,NA,1811,"Marblehead","American Amber / Red Ale",305,16,"American Amber / Red Ale",306,"Night Shift Brewing","Everett","MA","Marblehead (Night Shift Brewing)" +"1488",1488,0.051,31,1622,"Jam Session","American Pale Ale (APA)",359,16,"American Pale Ale (APA)",360,"NoDa Brewing Company","Charlotte","NC","Jam Session (NoDa Brewing Company)" +"1489",1489,0.072,80,1621,"Hop Drop 'N Roll IPA","American IPA",359,16,"American IPA",360,"NoDa Brewing Company","Charlotte","NC","Hop Drop 'N Roll IPA (NoDa Brewing Company)" +"1490",1490,0.06,NA,1307,"Paleo IPA","English India Pale Ale (IPA)",431,12,NA,432,"North Country Brewing Company","Slippery Rock","PA","Paleo IPA (North Country Brewing Company)" +"1491",1491,0.061,NA,1306,"Buck Snort Stout","American Stout",431,12,NA,432,"North Country Brewing Company","Slippery Rock","PA","Buck Snort Stout (North Country Brewing Company)" +"1492",1492,0.055,NA,1305,"Station 33 Firehouse Red","Irish Red Ale",431,12,NA,432,"North Country Brewing Company","Slippery Rock","PA","Station 33 Firehouse Red (North Country Brewing Company)" +"1493",1493,0.045,NA,1304,"Slimy Pebble Pils","German Pilsener",431,12,NA,432,"North Country Brewing Company","Slippery Rock","PA","Slimy Pebble Pils (North Country Brewing Company)" +"1494",1494,0.045,50,2692,"Get Together","American IPA",0,16,"American IPA",1,"NorthGate Brewing","Minneapolis","MN","Get Together (NorthGate Brewing)" +"1495",1495,0.049,26,2691,"Maggie's Leap","Milk / Sweet Stout",0,16,NA,1,"NorthGate Brewing","Minneapolis","MN","Maggie's Leap (NorthGate Brewing)" +"1496",1496,0.048,19,2690,"Wall's End","English Brown Ale",0,16,NA,1,"NorthGate Brewing","Minneapolis","MN","Wall's End (NorthGate Brewing)" +"1497",1497,0.06,38,2689,"Pumpion","Pumpkin Ale",0,16,NA,1,"NorthGate Brewing","Minneapolis","MN","Pumpion (NorthGate Brewing)" +"1498",1498,0.06,25,2688,"Stronghold","American Porter",0,16,NA,1,"NorthGate Brewing","Minneapolis","MN","Stronghold (NorthGate Brewing)" +"1499",1499,0.0559999999999999,47,2687,"Parapet ESB","Extra Special / Strong Bitter (ESB)",0,16,NA,1,"NorthGate Brewing","Minneapolis","MN","Parapet ESB (NorthGate Brewing)" +"1500",1500,0.069,NA,1854,"Blue Boots IPA","American IPA",293,16,"American IPA",294,"Northampton Brewery","Northamtpon","MA","Blue Boots IPA (Northampton Brewery)" +"1501",1501,0.063,NA,1227,"Hoppy Bitch IPA","American IPA",450,16,"American IPA",451,"Northwest Brewing Company","Pacific","WA","Hoppy Bitch IPA (Northwest Brewing Company)" +"1502",1502,0.063,42,1226,"Three Skulls Ale Pale Ale","American Pale Ale (APA)",450,16,"American Pale Ale (APA)",451,"Northwest Brewing Company","Pacific","WA","Three Skulls Ale Pale Ale (Northwest Brewing Company)" +"1503",1503,0.045,NA,541,"Walter's Premium Pilsener Beer","German Pilsener",529,12,NA,530,"Northwoods Brewpub","Eau Claire","WI","Walter's Premium Pilsener Beer (Northwoods Brewpub)" +"1504",1504,0.045,NA,109,"Floppin' Crappie","American Pale Wheat Ale",529,12,"American Pale Wheat Ale",530,"Northwoods Brewpub","Eau Claire","WI","Floppin' Crappie (Northwoods Brewpub)" +"1505",1505,0.043,NA,1917,"Left of the Dial IPA","American IPA",271,12,"American IPA",272,"Notch Brewing Company","Ipswich","MA","Left of the Dial IPA (Notch Brewing Company)" +"1506",1506,0.04,NA,1190,"Notch Session Pils","Czech Pilsener",271,12,NA,272,"Notch Brewing Company","Ipswich","MA","Notch Session Pils (Notch Brewing Company)" +"1507",1507,0.055,NA,1264,"O'Fallon Pumpkin Beer","Pumpkin Ale",442,12,NA,443,"O'Fallon Brewery","O'Fallon","MO","O'Fallon Pumpkin Beer (O'Fallon Brewery)" +"1508",1508,0.061,66,1258,"5 Day IPA","American IPA",442,12,"American IPA",443,"O'Fallon Brewery","O'Fallon","MO","5 Day IPA (O'Fallon Brewery)" +"1509",1509,0.051,7,128,"O'Fallon Wheach","Fruit / Vegetable Beer",442,12,NA,443,"O'Fallon Brewery","O'Fallon","MO","O'Fallon Wheach (O'Fallon Brewery)" +"1510",1510,0.067,70,2331,"Watershed IPA","American IPA",150,12,"American IPA",151,"Oakshire Brewing","Eugene","OR","Watershed IPA (Oakshire Brewing)" +"1511",1511,0.054,24,1669,"Oakshire Amber Ale","American Amber / Red Ale",150,12,"American Amber / Red Ale",151,"Oakshire Brewing","Eugene","OR","Oakshire Amber Ale (Oakshire Brewing)" +"1512",1512,0.0579999999999999,27,1668,"Overcast Espresso Stout","American Stout",150,12,NA,151,"Oakshire Brewing","Eugene","OR","Overcast Espresso Stout (Oakshire Brewing)" +"1513",1513,0.067,70,999,"Watershed IPA (2013)","American IPA",150,12,"American IPA",151,"Oakshire Brewing","Eugene","OR","Watershed IPA (2013) (Oakshire Brewing)" +"1514",1514,0.0819999999999999,25,2247,"Lake Monster","Baltic Porter",184,16,NA,185,"Oasis Texas Brewing Company","Austin","TX","Lake Monster (Oasis Texas Brewing Company)" +"1515",1515,0.049,27,2071,"London Homesick Ale","English Bitter",184,12,NA,185,"Oasis Texas Brewing Company","Austin","TX","London Homesick Ale (Oasis Texas Brewing Company)" +"1516",1516,0.048,35,2070,"Luchesa Lager","Keller Bier / Zwickel Bier",184,12,NA,185,"Oasis Texas Brewing Company","Austin","TX","Luchesa Lager (Oasis Texas Brewing Company)" +"1517",1517,0.048,35,2069,"Slow Ride","American Pale Ale (APA)",184,12,"American Pale Ale (APA)",185,"Oasis Texas Brewing Company","Austin","TX","Slow Ride (Oasis Texas Brewing Company)" +"1518",1518,0.047,NA,2192,"Occidental Hefeweizen","American Pale Wheat Ale",200,16,"American Pale Wheat Ale",201,"Occidental Brewing Company","Portland","OR","Occidental Hefeweizen (Occidental Brewing Company)" +"1519",1519,0.051,NA,1130,"Occidental Dunkel","Dunkelweizen",200,16,NA,201,"Occidental Brewing Company","Portland","OR","Occidental Dunkel (Occidental Brewing Company)" +"1520",1520,0.05,NA,1129,"Occidental Altbier","Altbier",200,16,NA,201,"Occidental Brewing Company","Portland","OR","Occidental Altbier (Occidental Brewing Company)" +"1521",1521,0.045,NA,1081,"Occidental Kölsch","Kölsch",200,16,NA,201,"Occidental Brewing Company","Portland","OR","Occidental Kölsch (Occidental Brewing Company)" +"1522",1522,0.092,72,2335,"Perpetual Darkness","Belgian Strong Dark Ale",148,12,NA,149,"Odyssey Beerwerks","Arvada","CO","Perpetual Darkness (Odyssey Beerwerks)" +"1523",1523,0.087,29,2334,"Clan Warrior","Scotch Ale / Wee Heavy",148,12,NA,149,"Odyssey Beerwerks","Arvada","CO","Clan Warrior (Odyssey Beerwerks)" +"1524",1524,0.054,36,2333,"Psycho Penguin Vanilla Porter","American Porter",148,12,NA,149,"Odyssey Beerwerks","Arvada","CO","Psycho Penguin Vanilla Porter (Odyssey Beerwerks)" +"1525",1525,0.047,NA,1721,"Heliocentric Hefeweizen","Hefeweizen",148,12,NA,149,"Odyssey Beerwerks","Arvada","CO","Heliocentric Hefeweizen (Odyssey Beerwerks)" +"1526",1526,0.051,NA,1720,"Ghose Drifter Pale Ale","American Pale Ale (APA)",148,12,"American Pale Ale (APA)",149,"Odyssey Beerwerks","Arvada","CO","Ghose Drifter Pale Ale (Odyssey Beerwerks)" +"1527",1527,0.051,NA,1431,"Ghost Rider Pale Ale (2013)","American Pale Ale (APA)",148,12,"American Pale Ale (APA)",149,"Odyssey Beerwerks","Arvada","CO","Ghost Rider Pale Ale (2013) (Odyssey Beerwerks)" +"1528",1528,0.047,NA,1430,"Helios Hefeweizen (2013)","Hefeweizen",148,12,NA,149,"Odyssey Beerwerks","Arvada","CO","Helios Hefeweizen (2013) (Odyssey Beerwerks)" +"1529",1529,0.095,19,1059,"The Hole in Hadrian's Wall","Scottish Ale",471,16,NA,472,"Okoboji Brewing Company","Spirit Lake","IA","The Hole in Hadrian's Wall (Okoboji Brewing Company)" +"1530",1530,0.065,26,1058,"33 Select Brown Ale","American Brown Ale",471,16,NA,472,"Okoboji Brewing Company","Spirit Lake","IA","33 Select Brown Ale (Okoboji Brewing Company)" +"1531",1531,0.06,29,603,"Midwest Charm Farmhouse Ale","Saison / Farmhouse Ale",471,16,NA,472,"Okoboji Brewing Company","Spirit Lake","IA","Midwest Charm Farmhouse Ale (Okoboji Brewing Company)" +"1532",1532,0.05,45,602,"Boji Blue Pale Ale","American Pale Ale (APA)",471,16,"American Pale Ale (APA)",472,"Okoboji Brewing Company","Spirit Lake","IA","Boji Blue Pale Ale (Okoboji Brewing Company)" +"1533",1533,0.057,26,601,"Winter Games Select #32 Stout","American Stout",471,16,NA,472,"Okoboji Brewing Company","Spirit Lake","IA","Winter Games Select #32 Stout (Okoboji Brewing Company)" +"1534",1534,0.05,23,600,"Boji Beach Golden Rye Ale","Rye Beer",471,16,NA,472,"Okoboji Brewing Company","Spirit Lake","IA","Boji Beach Golden Rye Ale (Okoboji Brewing Company)" +"1535",1535,0.06,NA,1828,"Hopsmith Pale Lager","American Pale Lager",301,16,NA,302,"Old Forge Brewing Company","Danville","PA","Hopsmith Pale Lager (Old Forge Brewing Company)" +"1536",1536,0.065,65,1487,"Falling Down Brown Ale","American Brown Ale",301,16,NA,302,"Old Forge Brewing Company","Danville","PA","Falling Down Brown Ale (Old Forge Brewing Company)" +"1537",1537,0.068,NA,1486,"Resolution Rye Stout","American Stout",301,16,NA,302,"Old Forge Brewing Company","Danville","PA","Resolution Rye Stout (Old Forge Brewing Company)" +"1538",1538,0.055,NA,1485,"Plowshare Porter","American Porter",301,16,NA,302,"Old Forge Brewing Company","Danville","PA","Plowshare Porter (Old Forge Brewing Company)" +"1539",1539,0.046,20,1394,"Old Forge Pumpkin Ale","Pumpkin Ale",301,16,NA,302,"Old Forge Brewing Company","Danville","PA","Old Forge Pumpkin Ale (Old Forge Brewing Company)" +"1540",1540,0.045,NA,1381,"Endless Sun Ale","American Pale Wheat Ale",301,16,"American Pale Wheat Ale",302,"Old Forge Brewing Company","Danville","PA","Endless Sun Ale (Old Forge Brewing Company)" +"1541",1541,0.065,NA,900,"Celestial Blonde Ale","American Blonde Ale",301,16,"American Blonde Ale",302,"Old Forge Brewing Company","Danville","PA","Celestial Blonde Ale (Old Forge Brewing Company)" +"1542",1542,0.075,NA,891,"Overbite IPA","American IPA",301,16,"American IPA",302,"Old Forge Brewing Company","Danville","PA","Overbite IPA (Old Forge Brewing Company)" +"1543",1543,0.055,NA,509,"T-Rail Pale Ale","American Pale Ale (APA)",301,16,"American Pale Ale (APA)",302,"Old Forge Brewing Company","Danville","PA","T-Rail Pale Ale (Old Forge Brewing Company)" +"1544",1544,0.048,NA,508,"Endless Summer Ale (2011)","American Pale Wheat Ale",301,16,"American Pale Wheat Ale",302,"Old Forge Brewing Company","Danville","PA","Endless Summer Ale (2011) (Old Forge Brewing Company)" +"1545",1545,0.053,NA,1530,"Clem's Gold","American Pale Lager",390,16,NA,391,"Orlison Brewing Company","Airway Heights","WA","Clem's Gold (Orlison Brewing Company)" +"1546",1546,0.055,NA,1529,"Lizzy's Red","American Amber / Red Lager",390,16,NA,391,"Orlison Brewing Company","Airway Heights","WA","Lizzy's Red (Orlison Brewing Company)" +"1547",1547,0.067,NA,1528,"Orlison India Pale Lager","American Pale Lager",390,16,NA,391,"Orlison Brewing Company","Airway Heights","WA","Orlison India Pale Lager (Orlison Brewing Company)" +"1548",1548,0.042,NA,1527,"Brünette","Euro Dark Lager",390,16,NA,391,"Orlison Brewing Company","Airway Heights","WA","Brünette (Orlison Brewing Company)" +"1549",1549,0.0409999999999999,NA,1526,"Havanüther","Light Lager",390,16,NA,391,"Orlison Brewing Company","Airway Heights","WA","Havanüther (Orlison Brewing Company)" +"1550",1550,0.065,NA,2113,"Lyric Ale","Saison / Farmhouse Ale",216,12,NA,217,"Orpheus Brewing","Atlanta","GA","Lyric Ale (Orpheus Brewing)" +"1551",1551,0.053,NA,2112,"Atalanta","Saison / Farmhouse Ale",216,12,NA,217,"Orpheus Brewing","Atlanta","GA","Atalanta (Orpheus Brewing)" +"1552",1552,0.049,35,2302,"Pinner Throwback IPA","American IPA",166,12,"American IPA",167,"Oskar Blues Brewery","Longmont","CO","Pinner Throwback IPA (Oskar Blues Brewery)" +"1553",1553,0.052,NA,1883,"Centennial State Pale Ale","American Pale Ale (APA)",166,19.2,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Centennial State Pale Ale (Oskar Blues Brewery)" +"1554",1554,0.08,NA,1859,"Old Chub NITRO","Scotch Ale / Wee Heavy",166,16,NA,167,"Oskar Blues Brewery","Longmont","CO","Old Chub NITRO (Oskar Blues Brewery)" +"1555",1555,NA,NA,1796,"The CROWLER™",NA,166,32,NA,167,"Oskar Blues Brewery","Longmont","CO","The CROWLER™ (Oskar Blues Brewery)" +"1556",1556,NA,NA,1790,"CAN'D AID Foundation",NA,166,12,NA,167,"Oskar Blues Brewery","Longmont","CO","CAN'D AID Foundation (Oskar Blues Brewery)" +"1557",1557,NA,NA,1752,"Icey.P.A.","American IPA",166,16,"American IPA",167,"Oskar Blues Brewery","Longmont","CO","Icey.P.A. (Oskar Blues Brewery)" +"1558",1558,0.05,NA,1751,"One Nut Brown","English Brown Ale",166,12,NA,167,"Oskar Blues Brewery","Longmont","CO","One Nut Brown (Oskar Blues Brewery)" +"1559",1559,NA,NA,1750,"Birth IPA","American IPA",166,12,"American IPA",167,"Oskar Blues Brewery","Longmont","CO","Birth IPA (Oskar Blues Brewery)" +"1560",1560,0.065,65,1444,"Dale's Pale Ale","American Pale Ale (APA)",166,12,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Dale's Pale Ale (Oskar Blues Brewery)" +"1561",1561,0.065,65,1252,"Dale's Pale Ale","American Pale Ale (APA)",166,12,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Dale's Pale Ale (Oskar Blues Brewery)" +"1562",1562,0.053,35,1167,"Mama's Little Yella Pils","Czech Pilsener",166,19.2,NA,167,"Oskar Blues Brewery","Longmont","CO","Mama's Little Yella Pils (Oskar Blues Brewery)" +"1563",1563,0.085,NA,993,"oSKAr the G'Rauch","American IPA",166,19.2,"American IPA",167,"Oskar Blues Brewery","Longmont","CO","oSKAr the G'Rauch (Oskar Blues Brewery)" +"1564",1564,0.085,NA,992,"oSKAr the G'Rauch","American IPA",166,16,"American IPA",167,"Oskar Blues Brewery","Longmont","CO","oSKAr the G'Rauch (Oskar Blues Brewery)" +"1565",1565,0.065,65,955,"Dale's Pale Ale","American Pale Ale (APA)",166,19.2,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Dale's Pale Ale (Oskar Blues Brewery)" +"1566",1566,0.07,NA,933,"The Deuce","American Brown Ale",166,16,NA,167,"Oskar Blues Brewery","Longmont","CO","The Deuce (Oskar Blues Brewery)" +"1567",1567,0.065,65,892,"Dale's Pale Ale (10 Year Anniversary)","American Pale Ale (APA)",166,12,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Dale's Pale Ale (10 Year Anniversary) (Oskar Blues Brewery)" +"1568",1568,0.065,65,828,"Dale's Pale Ale (2012)","American Pale Ale (APA)",166,12,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Dale's Pale Ale (2012) (Oskar Blues Brewery)" +"1569",1569,0.087,85,806,"Gordon Imperial Red (2010)","American Double / Imperial IPA",166,12,"American Double / Imperial IPA",167,"Oskar Blues Brewery","Longmont","CO","Gordon Imperial Red (2010) (Oskar Blues Brewery)" +"1570",1570,0.065,65,755,"Dale's Pale Ale (2011)","American Pale Ale (APA)",166,12,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Dale's Pale Ale (2011) (Oskar Blues Brewery)" +"1571",1571,0.065,65,754,"Dale's Pale Ale (2010)","American Pale Ale (APA)",166,12,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Dale's Pale Ale (2010) (Oskar Blues Brewery)" +"1572",1572,0.087,85,726,"G'KNIGHT (16 oz.)","American Double / Imperial IPA",166,16,"American Double / Imperial IPA",167,"Oskar Blues Brewery","Longmont","CO","G'KNIGHT (16 oz.) (Oskar Blues Brewery)" +"1573",1573,0.09,NA,720,"15th Anniversary Abbey Ale (2012)","Belgian Dark Ale",166,16,NA,167,"Oskar Blues Brewery","Longmont","CO","15th Anniversary Abbey Ale (2012) (Oskar Blues Brewery)" +"1574",1574,0.08,NA,661,"Chaka","Belgian Strong Pale Ale",166,16,NA,167,"Oskar Blues Brewery","Longmont","CO","Chaka (Oskar Blues Brewery)" +"1575",1575,0.08,70,585,"HGH (Home Grown Hops): Part Duh","American Strong Ale",166,12,NA,167,"Oskar Blues Brewery","Longmont","CO","HGH (Home Grown Hops): Part Duh (Oskar Blues Brewery)" +"1576",1576,0.08,NA,565,"Deviant Dale's IPA","American Double / Imperial IPA",166,16,"American Double / Imperial IPA",167,"Oskar Blues Brewery","Longmont","CO","Deviant Dale's IPA (Oskar Blues Brewery)" +"1577",1577,0.09,60,391,"One Hit Wonder","American Double / Imperial IPA",166,12,"American Double / Imperial IPA",167,"Oskar Blues Brewery","Longmont","CO","One Hit Wonder (Oskar Blues Brewery)" +"1578",1578,0.087,85,388,"G'KNIGHT (12 oz.)","American Double / Imperial IPA",166,12,"American Double / Imperial IPA",167,"Oskar Blues Brewery","Longmont","CO","G'KNIGHT (12 oz.) (Oskar Blues Brewery)" +"1579",1579,0.099,98,8,"Ten Fidy Imperial Stout","Russian Imperial Stout",166,12,NA,167,"Oskar Blues Brewery","Longmont","CO","Ten Fidy Imperial Stout (Oskar Blues Brewery)" +"1580",1580,0.053,35,7,"Mama's Little Yella Pils","Czech Pilsener",166,12,NA,167,"Oskar Blues Brewery","Longmont","CO","Mama's Little Yella Pils (Oskar Blues Brewery)" +"1581",1581,0.099,100,6,"GUBNA Imperial IPA","American Double / Imperial IPA",166,12,"American Double / Imperial IPA",167,"Oskar Blues Brewery","Longmont","CO","GUBNA Imperial IPA (Oskar Blues Brewery)" +"1582",1582,0.08,35,5,"Old Chub","Scottish Ale",166,12,NA,167,"Oskar Blues Brewery","Longmont","CO","Old Chub (Oskar Blues Brewery)" +"1583",1583,0.087,85,4,"Gordon Ale (2009)","American Double / Imperial IPA",166,12,"American Double / Imperial IPA",167,"Oskar Blues Brewery","Longmont","CO","Gordon Ale (2009) (Oskar Blues Brewery)" +"1584",1584,0.065,65,1,"Dale's Pale Ale","American Pale Ale (APA)",166,12,"American Pale Ale (APA)",167,"Oskar Blues Brewery","Longmont","CO","Dale's Pale Ale (Oskar Blues Brewery)" +"1585",1585,0.092,85,805,"Gordon (2005)","American Double / Imperial IPA",503,12,"American Double / Imperial IPA",504,"Oskar Blues Brewery","Lyons","CO","Gordon (2005) (Oskar Blues Brewery)" +"1586",1586,0.095,98,804,"Ten Fidy Imperial Stout (2008)","Russian Imperial Stout",503,12,NA,504,"Oskar Blues Brewery","Lyons","CO","Ten Fidy Imperial Stout (2008) (Oskar Blues Brewery)" +"1587",1587,0.099,98,803,"Ten Fidy Imperial Stout (2007)","Russian Imperial Stout",503,12,NA,504,"Oskar Blues Brewery","Lyons","CO","Ten Fidy Imperial Stout (2007) (Oskar Blues Brewery)" +"1588",1588,0.08,35,787,"Old Chub (2008)","Scottish Ale",503,12,NA,504,"Oskar Blues Brewery","Lyons","CO","Old Chub (2008) (Oskar Blues Brewery)" +"1589",1589,0.08,35,786,"Old Chub (2004)","Scottish Ale",503,12,NA,504,"Oskar Blues Brewery","Lyons","CO","Old Chub (2004) (Oskar Blues Brewery)" +"1590",1590,0.08,35,785,"Old Chub (2003)","Scottish Ale",503,12,NA,504,"Oskar Blues Brewery","Lyons","CO","Old Chub (2003) (Oskar Blues Brewery)" +"1591",1591,0.065,65,745,"Dale's Pale Ale (2008)","American Pale Ale (APA)",503,12,"American Pale Ale (APA)",504,"Oskar Blues Brewery","Lyons","CO","Dale's Pale Ale (2008) (Oskar Blues Brewery)" +"1592",1592,0.065,65,744,"Dale's Pale Ale (2006)","American Pale Ale (APA)",503,12,"American Pale Ale (APA)",504,"Oskar Blues Brewery","Lyons","CO","Dale's Pale Ale (2006) (Oskar Blues Brewery)" +"1593",1593,0.065,65,743,"Dale's Pale Ale (2004)","American Pale Ale (APA)",503,12,"American Pale Ale (APA)",504,"Oskar Blues Brewery","Lyons","CO","Dale's Pale Ale (2004) (Oskar Blues Brewery)" +"1594",1594,0.065,65,742,"Dale's Pale Ale (2003)","American Pale Ale (APA)",503,12,"American Pale Ale (APA)",504,"Oskar Blues Brewery","Lyons","CO","Dale's Pale Ale (2003) (Oskar Blues Brewery)" +"1595",1595,0.065,65,741,"Dale's Pale Ale (2002)","American Pale Ale (APA)",503,12,"American Pale Ale (APA)",504,"Oskar Blues Brewery","Lyons","CO","Dale's Pale Ale (2002) (Oskar Blues Brewery)" +"1596",1596,0.052,NA,734,"Leroy (2005)","American Brown Ale",503,12,NA,504,"Oskar Blues Brewery","Lyons","CO","Leroy (2005) (Oskar Blues Brewery)" +"1597",1597,0.087,60,733,"Gordon Beer (2006)","American Double / Imperial IPA",503,12,"American Double / Imperial IPA",504,"Oskar Blues Brewery","Lyons","CO","Gordon Beer (2006) (Oskar Blues Brewery)" +"1598",1598,0.087,85,1533,"G'KNIGHT","American Double / Imperial IPA",389,12,"American Double / Imperial IPA",390,"Oskar Blues Brewery (North Carol...","Brevard","NC","G'KNIGHT (Oskar Blues Brewery (North Carol...)" +"1599",1599,0.099,98,1532,"Ten Fidy","Russian Imperial Stout",389,12,NA,390,"Oskar Blues Brewery (North Carol...","Brevard","NC","Ten Fidy (Oskar Blues Brewery (North Carol...)" +"1600",1600,0.08,85,1328,"Deviant Dale's IPA","American Double / Imperial IPA",389,16,"American Double / Imperial IPA",390,"Oskar Blues Brewery (North Carol...","Brevard","NC","Deviant Dale's IPA (Oskar Blues Brewery (North Carol...)" +"1601",1601,0.08,35,1175,"Old Chub","Scottish Ale",389,12,NA,390,"Oskar Blues Brewery (North Carol...","Brevard","NC","Old Chub (Oskar Blues Brewery (North Carol...)" +"1602",1602,0.065,65,1166,"Dale's Pale Ale","American Pale Ale (APA)",389,19.2,"American Pale Ale (APA)",390,"Oskar Blues Brewery (North Carol...","Brevard","NC","Dale's Pale Ale (Oskar Blues Brewery (North Carol...)" +"1603",1603,0.065,65,1065,"Dale's Pale Ale","American Pale Ale (APA)",389,12,"American Pale Ale (APA)",390,"Oskar Blues Brewery (North Carol...","Brevard","NC","Dale's Pale Ale (Oskar Blues Brewery (North Carol...)" +"1604",1604,0.055,45,1908,"Fresh Slice White IPA","American White IPA",275,12,NA,276,"Otter Creek Brewing","Middlebury","VT","Fresh Slice White IPA (Otter Creek Brewing)" +"1605",1605,0.055,55,1946,"Overgrown American Pale Ale","American Pale Ale (APA)",261,12,"American Pale Ale (APA)",262,"Otter Creek Brewing","Waterbury","VT","Overgrown American Pale Ale (Otter Creek Brewing)" +"1606",1606,0.04,39,1961,"Ozark American Pale Ale","American Pale Ale (APA)",259,12,"American Pale Ale (APA)",260,"Ozark Beer Company","Rogers","AR","Ozark American Pale Ale (Ozark Beer Company)" +"1607",1607,0.048,NA,1684,"Hula Hoppie Session IPA","American IPA",341,12,"American IPA",342,"Palisade Brewing Company","Palisade","CO","Hula Hoppie Session IPA (Palisade Brewing Company)" +"1608",1608,0.053,NA,927,"Dirty Hippie Dark Wheat","American Dark Wheat Ale",341,12,NA,342,"Palisade Brewing Company","Palisade","CO","Dirty Hippie Dark Wheat (Palisade Brewing Company)" +"1609",1609,0.052,23,1268,"Rustic Red","Irish Red Ale",441,16,NA,442,"Pateros Creek Brewing Company","Fort Collins","CO","Rustic Red (Pateros Creek Brewing Company)" +"1610",1610,0.053,48,697,"Stimulator Pale Ale","American Pale Ale (APA)",441,16,"American Pale Ale (APA)",442,"Pateros Creek Brewing Company","Fort Collins","CO","Stimulator Pale Ale (Pateros Creek Brewing Company)" +"1611",1611,0.045,22,696,"Old Town Ale","Kölsch",441,16,NA,442,"Pateros Creek Brewing Company","Fort Collins","CO","Old Town Ale (Pateros Creek Brewing Company)" +"1612",1612,0.044,28,695,"Car 21","English Bitter",441,16,NA,442,"Pateros Creek Brewing Company","Fort Collins","CO","Car 21 (Pateros Creek Brewing Company)" +"1613",1613,0.05,24,694,"Cache La Porter","American Porter",441,16,NA,442,"Pateros Creek Brewing Company","Fort Collins","CO","Cache La Porter (Pateros Creek Brewing Company)" +"1614",1614,0.042,35,1805,"Rodeo Rye Pale Ale","American Pale Ale (APA)",307,12,"American Pale Ale (APA)",308,"Payette Brewing Company","Garden City","ID","Rodeo Rye Pale Ale (Payette Brewing Company)" +"1615",1615,0.062,65,1048,"Outlaw IPA","American IPA",307,12,"American IPA",308,"Payette Brewing Company","Garden City","ID","Outlaw IPA (Payette Brewing Company)" +"1616",1616,0.044,NA,1043,"North Fork Lager","American Pale Lager",307,12,NA,308,"Payette Brewing Company","Garden City","ID","North Fork Lager (Payette Brewing Company)" +"1617",1617,0.048,35,890,"Payette Pale Ale","American Pale Ale (APA)",307,12,"American Pale Ale (APA)",308,"Payette Brewing Company","Garden City","ID","Payette Pale Ale (Payette Brewing Company)" +"1618",1618,0.055,25,775,"Mutton Buster","American Brown Ale",307,12,NA,308,"Payette Brewing Company","Garden City","ID","Mutton Buster (Payette Brewing Company)" +"1619",1619,0.05,NA,1087,"Side Kick Kölsch","Kölsch",468,12,NA,469,"Peace Tree Brewing Company","Knoxville","IA","Side Kick Kölsch (Peace Tree Brewing Company)" +"1620",1620,0.046,NA,1931,"Fresh Cut Pilsner","American Pilsner",266,12,NA,267,"Peak Organic Brewing Company","Portland","ME","Fresh Cut Pilsner (Peak Organic Brewing Company)" +"1621",1621,0.05,61,1930,"Summer Session Ale","American Pale Wheat Ale",266,12,"American Pale Wheat Ale",267,"Peak Organic Brewing Company","Portland","ME","Summer Session Ale (Peak Organic Brewing Company)" +"1622",1622,0.04,12,2238,"Lobo Lito","Light Lager",187,12,NA,188,"Pedernales Brewing Company","Fredericksburg","TX","Lobo Lito (Pedernales Brewing Company)" +"1623",1623,0.05,17,2144,"Robert Earl Keen Honey Pils","American Pilsner",187,12,NA,188,"Pedernales Brewing Company","Fredericksburg","TX","Robert Earl Keen Honey Pils (Pedernales Brewing Company)" +"1624",1624,0.065,77,2175,"Mound Builder IPA","American IPA",205,12,"American IPA",206,"People's Brewing Company","Lafayette","IN","Mound Builder IPA (People's Brewing Company)" +"1625",1625,0.062,62,2168,"Amazon Princess IPA","American IPA",205,12,"American IPA",206,"People's Brewing Company","Lafayette","IN","Amazon Princess IPA (People's Brewing Company)" +"1626",1626,0.042,NA,1956,"Farmer's Daughter Wheat","American Pale Wheat Ale",205,12,"American Pale Wheat Ale",206,"People's Brewing Company","Lafayette","IN","Farmer's Daughter Wheat (People's Brewing Company)" +"1627",1627,0.045,NA,1794,"People's Pilsner","German Pilsener",205,12,NA,206,"People's Brewing Company","Lafayette","IN","People's Pilsner (People's Brewing Company)" +"1628",1628,0.055,10,2633,"Hotbox Brown","American Brown Ale",13,12,NA,14,"Perrin Brewing Company","Comstock Park","MI","Hotbox Brown (Perrin Brewing Company)" +"1629",1629,0.048,15,2632,"Gold","American Blonde Ale",13,12,"American Blonde Ale",14,"Perrin Brewing Company","Comstock Park","MI","Gold (Perrin Brewing Company)" +"1630",1630,0.0579999999999999,NA,2631,"Black","American Black Ale",13,12,NA,14,"Perrin Brewing Company","Comstock Park","MI","Black (Perrin Brewing Company)" +"1631",1631,0.065,65,2630,"98 Problems (Cuz A Hop Ain't One)","American IPA",13,12,"American IPA",14,"Perrin Brewing Company","Comstock Park","MI","98 Problems (Cuz A Hop Ain't One) (Perrin Brewing Company)" +"1632",1632,0.05,40,2629,"Veteran’s Pale Ale (VPA)","American Pale Ale (APA)",13,12,"American Pale Ale (APA)",14,"Perrin Brewing Company","Comstock Park","MI","Veteran’s Pale Ale (VPA) (Perrin Brewing Company)" +"1633",1633,0.05,35,2628,"Grapefruit IPA","American IPA",13,12,"American IPA",14,"Perrin Brewing Company","Comstock Park","MI","Grapefruit IPA (Perrin Brewing Company)" +"1634",1634,0.051,NA,1062,"Pete's ESP Lager (1998)","American Pale Lager",470,12,NA,471,"Pete's Brewing Company","San Antonio","TX","Pete's ESP Lager (1998) (Pete's Brewing Company)" +"1635",1635,0.047,NA,1061,"Pete's Wicked Summer Brew (1995)","American Pale Wheat Ale",470,12,"American Pale Wheat Ale",471,"Pete's Brewing Company","San Antonio","TX","Pete's Wicked Summer Brew (1995) (Pete's Brewing Company)" +"1636",1636,0.049,NA,1060,"Pete's Wicked Bohemian Pilsner (1997)","Czech Pilsener",470,12,NA,471,"Pete's Brewing Company","San Antonio","TX","Pete's Wicked Bohemian Pilsner (1997) (Pete's Brewing Company)" +"1637",1637,NA,NA,1056,"Pete's Wicked Pale Ale (1997)","American Pale Ale (APA)",470,12,"American Pale Ale (APA)",471,"Pete's Brewing Company","San Antonio","TX","Pete's Wicked Pale Ale (1997) (Pete's Brewing Company)" +"1638",1638,0.047,NA,1055,"Pete's Wicked Summer Brew (2002)","American Pale Wheat Ale",470,12,"American Pale Wheat Ale",471,"Pete's Brewing Company","San Antonio","TX","Pete's Wicked Summer Brew (2002) (Pete's Brewing Company)" +"1639",1639,0.047,NA,1054,"Pete's Wicked Summer Brew (1997)","American Pale Wheat Ale",470,12,"American Pale Wheat Ale",471,"Pete's Brewing Company","San Antonio","TX","Pete's Wicked Summer Brew (1997) (Pete's Brewing Company)" +"1640",1640,0.047,NA,1053,"Pete's Wicked Summer Brew (1996)","American Pale Wheat Ale",470,12,"American Pale Wheat Ale",471,"Pete's Brewing Company","San Antonio","TX","Pete's Wicked Summer Brew (1996) (Pete's Brewing Company)" +"1641",1641,0.0409999999999999,12,2635,"Sparkle","American Pale Lager",11,16,NA,12,"Petoskey Brewing","Petoskey","MI","Sparkle (Petoskey Brewing)" +"1642",1642,0.059,25,1404,"North 45 Amber Ale","American Amber / Red Ale",11,16,"American Amber / Red Ale",12,"Petoskey Brewing","Petoskey","MI","North 45 Amber Ale (Petoskey Brewing)" +"1643",1643,0.069,20,1403,"Horny Monk","Dubbel",11,16,NA,12,"Petoskey Brewing","Petoskey","MI","Horny Monk (Petoskey Brewing)" +"1644",1644,0.067,74,1402,"Mind's Eye PA","American IPA",11,16,"American IPA",12,"Petoskey Brewing","Petoskey","MI","Mind's Eye PA (Petoskey Brewing)" +"1645",1645,0.061,60,2312,"Camelback","American IPA",157,12,"American IPA",158,"Phoenix Ale Brewery","Phoenix","AZ","Camelback (Phoenix Ale Brewery)" +"1646",1646,0.0559999999999999,NA,1636,"Local 5 Pale Ale","American Pale Ale (APA)",355,16,"American Pale Ale (APA)",356,"Pikes Peak Brewing Company","Monument","CO","Local 5 Pale Ale (Pikes Peak Brewing Company)" +"1647",1647,0.073,NA,1518,"Devils Head Red Ale","American Amber / Red Ale",355,16,"American Amber / Red Ale",356,"Pikes Peak Brewing Company","Monument","CO","Devils Head Red Ale (Pikes Peak Brewing Company)" +"1648",1648,0.07,75,1384,"Elephant Rock IPA","American IPA",355,12,"American IPA",356,"Pikes Peak Brewing Company","Monument","CO","Elephant Rock IPA (Pikes Peak Brewing Company)" +"1649",1649,0.05,NA,1797,"Black Bay Milk Stout","Milk / Sweet Stout",310,12,NA,311,"Pine Street Brewery","San Francisco","CA","Black Bay Milk Stout (Pine Street Brewery)" +"1650",1650,0.05,NA,1437,"Atom Splitter Pale Ale","American Pale Ale (APA)",310,12,"American Pale Ale (APA)",311,"Pine Street Brewery","San Francisco","CA","Atom Splitter Pale Ale (Pine Street Brewery)" +"1651",1651,0.06,20,1791,"Hot Date Ale","Chile Beer",314,16,NA,315,"Piney River Brewing Company","Bucryus","MO","Hot Date Ale (Piney River Brewing Company)" +"1652",1652,0.07,NA,1540,"Masked Bandit IPA","American Black Ale",314,16,NA,315,"Piney River Brewing Company","Bucryus","MO","Masked Bandit IPA (Piney River Brewing Company)" +"1653",1653,0.06,24,1491,"Sweet Potato Ale","Fruit / Vegetable Beer",314,16,NA,315,"Piney River Brewing Company","Bucryus","MO","Sweet Potato Ale (Piney River Brewing Company)" +"1654",1654,0.045,18,1335,"Float Trip Ale","American Blonde Ale",314,16,"American Blonde Ale",315,"Piney River Brewing Company","Bucryus","MO","Float Trip Ale (Piney River Brewing Company)" +"1655",1655,0.055,25,847,"Old Tom Porter","American Porter",314,16,NA,315,"Piney River Brewing Company","Bucryus","MO","Old Tom Porter (Piney River Brewing Company)" +"1656",1656,0.045,18,846,"Black Walnut Wheat","American Dark Wheat Ale",314,16,NA,315,"Piney River Brewing Company","Bucryus","MO","Black Walnut Wheat (Piney River Brewing Company)" +"1657",1657,0.055,20,521,"McKinney Eddy Amber Ale","American Amber / Red Ale",314,16,"American Amber / Red Ale",315,"Piney River Brewing Company","Bucryus","MO","McKinney Eddy Amber Ale (Piney River Brewing Company)" +"1658",1658,0.07,70,479,"Missouri Mule India Pale Ale","American IPA",314,16,"American IPA",315,"Piney River Brewing Company","Bucryus","MO","Missouri Mule India Pale Ale (Piney River Brewing Company)" +"1659",1659,0.065,NA,2559,"Blood of the Unicorn","American Amber / Red Ale",52,16,"American Amber / Red Ale",53,"Pipeworks Brewing Company","Chicago","IL","Blood of the Unicorn (Pipeworks Brewing Company)" +"1660",1660,0.069,51,1760,"GreyBeard™ IPA","American IPA",324,12,"American IPA",325,"Pisgah Brewing Company","Black Mountain","NC","GreyBeard™ IPA (Pisgah Brewing Company)" +"1661",1661,0.057,31,1759,"Pisgah Pale Ale","American Pale Ale (APA)",324,12,"American Pale Ale (APA)",325,"Pisgah Brewing Company","Black Mountain","NC","Pisgah Pale Ale (Pisgah Brewing Company)" +"1662",1662,0.045,NA,1589,"PONTO S.I.P.A.","American IPA",370,16,"American IPA",371,"Pizza Port Brewing Company","Carlsbad","CA","PONTO S.I.P.A. (Pizza Port Brewing Company)" +"1663",1663,0.049,NA,1457,"Chronic Ale","American Amber / Red Ale",370,16,"American Amber / Red Ale",371,"Pizza Port Brewing Company","Carlsbad","CA","Chronic Ale (Pizza Port Brewing Company)" +"1664",1664,0.068,NA,1191,"Swami's India Pale Ale","American IPA",370,16,"American IPA",371,"Pizza Port Brewing Company","Carlsbad","CA","Swami's India Pale Ale (Pizza Port Brewing Company)" +"1665",1665,0.05,NA,2336,"New Cleveland Palesner","American Pilsner",147,12,NA,148,"Platform Beer Company","Cleveland","OH","New Cleveland Palesner (Platform Beer Company)" +"1666",1666,0.054,45,2553,"Mazzie","American Pale Ale (APA)",55,12,"American Pale Ale (APA)",56,"Pollyanna Brewing Company","Lemont","IL","Mazzie (Pollyanna Brewing Company)" +"1667",1667,0.099,NA,1909,"Big Chuck Barleywine","American Barleywine",274,12,NA,275,"Portside Brewery","Cleveland","OH","Big Chuck Barleywine (Portside Brewery)" +"1668",1668,NA,NA,335,"Ponderosa IPA","American IPA",548,12,"American IPA",549,"Prescott Brewing Company","Prescott","AZ","Ponderosa IPA (Prescott Brewing Company)" +"1669",1669,NA,NA,64,"Liquid Amber Ale","American Amber / Red Ale",548,12,"American Amber / Red Ale",549,"Prescott Brewing Company","Prescott","AZ","Liquid Amber Ale (Prescott Brewing Company)" +"1670",1670,0.059,14,2360,"Morning Wood Wheat (Current)","American Pale Wheat Ale",135,12,"American Pale Wheat Ale",136,"Pug Ryan's Brewery","Dillon","CO","Morning Wood Wheat (Current) (Pug Ryan's Brewery)" +"1671",1671,0.069,17,1463,"Hideout Helles","Munich Helles Lager",135,12,NA,136,"Pug Ryan's Brewery","Dillon","CO","Hideout Helles (Pug Ryan's Brewery)" +"1672",1672,0.06,15,1462,"Dead Eye Dunkel","Munich Dunkel Lager",135,12,NA,136,"Pug Ryan's Brewery","Dillon","CO","Dead Eye Dunkel (Pug Ryan's Brewery)" +"1673",1673,0.0579999999999999,21,1461,"Peacemaker Pilsner","Czech Pilsener",135,12,NA,136,"Pug Ryan's Brewery","Dillon","CO","Peacemaker Pilsner (Pug Ryan's Brewery)" +"1674",1674,0.057,68,711,"Over the Rail Pale Ale","American Pale Ale (APA)",135,12,"American Pale Ale (APA)",136,"Pug Ryan's Brewery","Dillon","CO","Over the Rail Pale Ale (Pug Ryan's Brewery)" +"1675",1675,0.0579999999999999,21,188,"Pallavicini Pilsner (2009)","Czech Pilsener",135,12,NA,136,"Pug Ryan's Brewery","Dillon","CO","Pallavicini Pilsner (2009) (Pug Ryan's Brewery)" +"1676",1676,0.059,14,130,"Morning Wood Wheat (Current)","American Pale Wheat Ale",135,12,"American Pale Wheat Ale",136,"Pug Ryan's Brewery","Dillon","CO","Morning Wood Wheat (Current) (Pug Ryan's Brewery)" +"1677",1677,0.052,18,399,"Pyramid Hefeweizen (2011)","Hefeweizen",544,12,NA,545,"Pyramid Breweries","Seattle","WA","Pyramid Hefeweizen (2011) (Pyramid Breweries)" +"1678",1678,0.052,18,82,"Haywire Hefeweizen (2010)","Hefeweizen",544,16,NA,545,"Pyramid Breweries","Seattle","WA","Haywire Hefeweizen (2010) (Pyramid Breweries)" +"1679",1679,0.045,35,2031,"Golden Fleece","Belgian Pale Ale",246,12,NA,247,"Quest Brewing Company","Greenville","SC","Golden Fleece (Quest Brewing Company)" +"1680",1680,0.055,30,2030,"Smoking Mirror","American Porter",246,12,NA,247,"Quest Brewing Company","Greenville","SC","Smoking Mirror (Quest Brewing Company)" +"1681",1681,0.046,NA,2269,"Rahr's Blonde","Munich Helles Lager",176,12,NA,177,"Rahr & Sons Brewing Company","Fort Worth","TX","Rahr's Blonde (Rahr & Sons Brewing Company)" +"1682",1682,0.0579999999999999,60,2229,"Pride of Texas Pale Ale","American Pale Ale (APA)",176,12,"American Pale Ale (APA)",177,"Rahr & Sons Brewing Company","Fort Worth","TX","Pride of Texas Pale Ale (Rahr & Sons Brewing Company)" +"1683",1683,0.044,5,2370,"18th Anniversary Gose","Gose",128,12,NA,129,"Real Ale Brewing Company","Blanco","TX","18th Anniversary Gose (Real Ale Brewing Company)" +"1684",1684,0.046,25,2211,"White (2015)","Witbier",128,12,NA,129,"Real Ale Brewing Company","Blanco","TX","White (2015) (Real Ale Brewing Company)" +"1685",1685,0.099,85,1861,"BLAKKR","American Black Ale",128,12,NA,129,"Real Ale Brewing Company","Blanco","TX","BLAKKR (Real Ale Brewing Company)" +"1686",1686,0.051,21,1718,"Firemans #4 Blonde Ale (2013)","American Blonde Ale",128,12,"American Blonde Ale",129,"Real Ale Brewing Company","Blanco","TX","Firemans #4 Blonde Ale (2013) (Real Ale Brewing Company)" +"1687",1687,0.059,NA,1290,"The Sword Iron Swan Ale","English Pale Ale",128,12,NA,129,"Real Ale Brewing Company","Blanco","TX","The Sword Iron Swan Ale (Real Ale Brewing Company)" +"1688",1688,0.053,52,1091,"Hans' Pils (2015)","German Pilsener",128,12,NA,129,"Real Ale Brewing Company","Blanco","TX","Hans' Pils (2015) (Real Ale Brewing Company)" +"1689",1689,0.06,50,1086,"Four Squared (2015)","American Blonde Ale",128,12,"American Blonde Ale",129,"Real Ale Brewing Company","Blanco","TX","Four Squared (2015) (Real Ale Brewing Company)" +"1690",1690,0.051,21,830,"Firemans #4 Blonde Ale (2015)","American Blonde Ale",128,12,"American Blonde Ale",129,"Real Ale Brewing Company","Blanco","TX","Firemans #4 Blonde Ale (2015) (Real Ale Brewing Company)" +"1691",1691,0.072,55,1021,"Watership Brown Ale","American Brown Ale",475,12,NA,476,"Red Hare Brewing Company","Marietta","GA","Watership Brown Ale (Red Hare Brewing Company)" +"1692",1692,0.062,55,938,"Gangway IPA","American IPA",475,12,"American IPA",476,"Red Hare Brewing Company","Marietta","GA","Gangway IPA (Red Hare Brewing Company)" +"1693",1693,0.049,NA,715,"Long Day Lager","Czech Pilsener",475,12,NA,476,"Red Hare Brewing Company","Marietta","GA","Long Day Lager (Red Hare Brewing Company)" +"1694",1694,0.051,17,2516,"Farmer's Daughter Blonde","American Blonde Ale",68,16,"American Blonde Ale",69,"Red Shedman Farm Brewery and Hop...","Mt. Airy","MD","Farmer's Daughter Blonde (Red Shedman Farm Brewery and Hop...)" +"1695",1695,0.055,45,2515,"Pump House IPA","American IPA",68,16,"American IPA",69,"Red Shedman Farm Brewery and Hop...","Mt. Airy","MD","Pump House IPA (Red Shedman Farm Brewery and Hop...)" +"1696",1696,0.07,NA,2514,"Suicide Blonde IPA","Belgian IPA",68,16,NA,69,"Red Shedman Farm Brewery and Hop...","Mt. Airy","MD","Suicide Blonde IPA (Red Shedman Farm Brewery and Hop...)" +"1697",1697,0.047,25,2513,"Vanilla Porter","American Porter",68,16,NA,69,"Red Shedman Farm Brewery and Hop...","Mt. Airy","MD","Vanilla Porter (Red Shedman Farm Brewery and Hop...)" +"1698",1698,0.0579999999999999,18,2512,"Honey Rye","Rye Beer",68,16,NA,69,"Red Shedman Farm Brewery and Hop...","Mt. Airy","MD","Honey Rye (Red Shedman Farm Brewery and Hop...)" +"1699",1699,0.055,NA,1467,"Happy Cider","Cider",403,16,NA,404,"Red Tank Cider Company","Bend","OR","Happy Cider (Red Tank Cider Company)" +"1700",1700,0.065,44,945,"Long Hammer IPA","American IPA",487,16,"American IPA",488,"Redhook Brewery","Woodinville","WA","Long Hammer IPA (Redhook Brewery)" +"1701",1701,0.065,44,583,"Long Hammer IPA","American IPA",487,12,"American IPA",488,"Redhook Brewery","Woodinville","WA","Long Hammer IPA (Redhook Brewery)" +"1702",1702,0.0579999999999999,27,339,"Copper Hook (2011)","American Amber / Red Ale",487,12,"American Amber / Red Ale",488,"Redhook Brewery","Woodinville","WA","Copper Hook (2011) (Redhook Brewery)" +"1703",1703,0.08,NA,1375,"Nectar of the Hops","Mead",421,16,NA,422,"Redstone Meadery","Boulder","CO","Nectar of the Hops (Redstone Meadery)" +"1704",1704,0.08,NA,1374,"Sunshine Nectar","Mead",421,16,NA,422,"Redstone Meadery","Boulder","CO","Sunshine Nectar (Redstone Meadery)" +"1705",1705,0.08,NA,1373,"Black Raspberry Nectar","Mead",421,16,NA,422,"Redstone Meadery","Boulder","CO","Black Raspberry Nectar (Redstone Meadery)" +"1706",1706,0.05,16,2087,"Blood Orange Wit","Witbier",225,16,NA,226,"Refuge Brewery","Temecula","CA","Blood Orange Wit (Refuge Brewery)" +"1707",1707,0.05,40,2414,"Consilium","American Pale Ale (APA)",110,12,"American Pale Ale (APA)",111,"Renegade Brewing Company","Denver","CO","Consilium (Renegade Brewing Company)" +"1708",1708,0.09,60,1581,"Hammer & Sickle","Russian Imperial Stout",110,12,NA,111,"Renegade Brewing Company","Denver","CO","Hammer & Sickle (Renegade Brewing Company)" +"1709",1709,0.07,100,1176,"Redacted Rye IPA","American IPA",110,16,"American IPA",111,"Renegade Brewing Company","Denver","CO","Redacted Rye IPA (Renegade Brewing Company)" +"1710",1710,0.099,100,1006,"Elevation Triple India Pale Ale","American Double / Imperial IPA",110,12,"American Double / Imperial IPA",111,"Renegade Brewing Company","Denver","CO","Elevation Triple India Pale Ale (Renegade Brewing Company)" +"1711",1711,0.05,25,1005,"5:00 O'Clock Afternoon Ale","American Blonde Ale",110,16,"American Blonde Ale",111,"Renegade Brewing Company","Denver","CO","5:00 O'Clock Afternoon Ale (Renegade Brewing Company)" +"1712",1712,0.07,100,636,"Ryeteous Rye IPA (2012)","American IPA",110,16,"American IPA",111,"Renegade Brewing Company","Denver","CO","Ryeteous Rye IPA (2012) (Renegade Brewing Company)" +"1713",1713,0.064,NA,1538,"Stout Ol' Friend","American Stout",386,16,NA,387,"Revolution Brewing","Paonia","CO","Stout Ol' Friend (Revolution Brewing)" +"1714",1714,0.064,NA,1075,"Stout Ol' Friend (2012)","American Stout",386,16,NA,387,"Revolution Brewing","Paonia","CO","Stout Ol' Friend (2012) (Revolution Brewing)" +"1715",1715,NA,NA,710,"Rye Porter","American Porter",386,16,NA,387,"Revolution Brewing","Paonia","CO","Rye Porter (Revolution Brewing)" +"1716",1716,0.05,NA,709,"Miner's Gold","American Blonde Ale",386,16,"American Blonde Ale",387,"Revolution Brewing","Paonia","CO","Miner's Gold (Revolution Brewing)" +"1717",1717,0.046,NA,708,"Vienna Lager","Vienna Lager",386,16,NA,387,"Revolution Brewing","Paonia","CO","Vienna Lager (Revolution Brewing)" +"1718",1718,0.0559999999999999,NA,706,"Jessie's Garage","American Pale Ale (APA)",386,16,"American Pale Ale (APA)",387,"Revolution Brewing","Paonia","CO","Jessie's Garage (Revolution Brewing)" +"1719",1719,0.062,NA,220,"Colorado Red Ale","American Amber / Red Ale",386,12,"American Amber / Red Ale",387,"Revolution Brewing","Paonia","CO","Colorado Red Ale (Revolution Brewing)" +"1720",1720,NA,NA,219,"Miner's Gold","American Blonde Ale",386,12,"American Blonde Ale",387,"Revolution Brewing","Paonia","CO","Miner's Gold (Revolution Brewing)" +"1721",1721,0.055,40,2576,"Fist City","American Pale Ale (APA)",44,12,"American Pale Ale (APA)",45,"Revolution Brewing Company","Chicago","IL","Fist City (Revolution Brewing Company)" +"1722",1722,0.068,NA,1133,"A Little Crazy","Belgian Pale Ale",44,12,NA,45,"Revolution Brewing Company","Chicago","IL","A Little Crazy (Revolution Brewing Company)" +"1723",1723,0.0579999999999999,15,609,"Rosa Hibiscus Ale","Herbed / Spiced Beer",44,12,NA,45,"Revolution Brewing Company","Chicago","IL","Rosa Hibiscus Ale (Revolution Brewing Company)" +"1724",1724,0.061,31,418,"Fistmas Ale","Herbed / Spiced Beer",44,12,NA,45,"Revolution Brewing Company","Chicago","IL","Fistmas Ale (Revolution Brewing Company)" +"1725",1725,0.057,25,417,"Oktoberfest Revolution","Märzen / Oktoberfest",44,12,NA,45,"Revolution Brewing Company","Chicago","IL","Oktoberfest Revolution (Revolution Brewing Company)" +"1726",1726,0.068,28,416,"Eugene Porter","American Porter",44,12,NA,45,"Revolution Brewing Company","Chicago","IL","Eugene Porter (Revolution Brewing Company)" +"1727",1727,0.065,70,415,"Anti-Hero IPA","American IPA",44,12,"American IPA",45,"Revolution Brewing Company","Chicago","IL","Anti-Hero IPA (Revolution Brewing Company)" +"1728",1728,0.05,14,414,"Bottom Up Belgian Wit","Witbier",44,12,NA,45,"Revolution Brewing Company","Chicago","IL","Bottom Up Belgian Wit (Revolution Brewing Company)" +"1729",1729,0.057,42,2452,"Hustle","American Amber / Red Ale",93,12,"American Amber / Red Ale",94,"Rhinegeist Brewery","Cincinnati","OH","Hustle (Rhinegeist Brewery)" +"1730",1730,0.055,42,2451,"Pure Fury","American Pale Ale (APA)",93,12,"American Pale Ale (APA)",94,"Rhinegeist Brewery","Cincinnati","OH","Pure Fury (Rhinegeist Brewery)" +"1731",1731,0.06,60,2132,"Dad","American Amber / Red Ale",93,12,"American Amber / Red Ale",94,"Rhinegeist Brewery","Cincinnati","OH","Dad (Rhinegeist Brewery)" +"1732",1732,0.0579999999999999,35,1993,"Panther","American Porter",93,12,NA,94,"Rhinegeist Brewery","Cincinnati","OH","Panther (Rhinegeist Brewery)" +"1733",1733,0.052,21,1992,"Franz","Märzen / Oktoberfest",93,12,NA,94,"Rhinegeist Brewery","Cincinnati","OH","Franz (Rhinegeist Brewery)" +"1734",1734,0.043,45,1935,"Zen","American Pale Ale (APA)",93,12,"American Pale Ale (APA)",94,"Rhinegeist Brewery","Cincinnati","OH","Zen (Rhinegeist Brewery)" +"1735",1735,0.072,75,1852,"Truth","American IPA",93,12,"American IPA",94,"Rhinegeist Brewery","Cincinnati","OH","Truth (Rhinegeist Brewery)" +"1736",1736,0.048,25,1851,"Cougar","American Blonde Ale",93,12,"American Blonde Ale",94,"Rhinegeist Brewery","Cincinnati","OH","Cougar (Rhinegeist Brewery)" +"1737",1737,0.038,NA,2307,"Smooth Operator","Cream Ale",162,16,NA,163,"Right Brain Brewery","Traverse City","MI","Smooth Operator (Right Brain Brewery)" +"1738",1738,0.035,NA,2580,"Gose","Gose",42,16,NA,43,"Rising Tide Brewing Company","Portland","ME","Gose (Rising Tide Brewing Company)" +"1739",1739,0.043,NA,1807,"Maine Island Trail Ale","American Pale Ale (APA)",42,16,"American Pale Ale (APA)",43,"Rising Tide Brewing Company","Portland","ME","Maine Island Trail Ale (Rising Tide Brewing Company)" +"1740",1740,0.05,NA,1180,"River North White Ale","Witbier",459,16,NA,460,"River North Brewery","Denver","CO","River North White Ale (River North Brewery)" +"1741",1741,0.05,NA,1179,"River North Ale","American Amber / Red Ale",459,16,"American Amber / Red Ale",460,"River North Brewery","Denver","CO","River North Ale (River North Brewery)" +"1742",1742,0.05,55,1771,"Lil SIPA","American IPA",321,16,"American IPA",322,"Rivertown Brewing Company","Lockland","OH","Lil SIPA (Rivertown Brewing Company)" +"1743",1743,0.055,60,1654,"Hop Bomber Rye Pale Ale","American Pale Ale (APA)",321,16,"American Pale Ale (APA)",322,"Rivertown Brewing Company","Lockland","OH","Hop Bomber Rye Pale Ale (Rivertown Brewing Company)" +"1744",1744,0.05,100,2579,"Jah Mon","American IPA",43,12,"American IPA",44,"Rivertowne Brewing Company","Export","PA","Jah Mon (Rivertowne Brewing Company)" +"1745",1745,0.062,NA,2373,"Oktoberfest","Märzen / Oktoberfest",43,12,NA,44,"Rivertowne Brewing Company","Export","PA","Oktoberfest (Rivertowne Brewing Company)" +"1746",1746,0.08,NA,2049,"Headless Wylie","Pumpkin Ale",43,12,NA,44,"Rivertowne Brewing Company","Export","PA","Headless Wylie (Rivertowne Brewing Company)" +"1747",1747,0.05,NA,2048,"Dayman IPA","American IPA",43,12,"American IPA",44,"Rivertowne Brewing Company","Export","PA","Dayman IPA (Rivertowne Brewing Company)" +"1748",1748,0.071,NA,1880,"All Aboard! Anniversary Stout","Oatmeal Stout",43,12,NA,44,"Rivertowne Brewing Company","Export","PA","All Aboard! Anniversary Stout (Rivertowne Brewing Company)" +"1749",1749,0.062,NA,1879,"Hop Lace","American White IPA",43,12,NA,44,"Rivertowne Brewing Company","Export","PA","Hop Lace (Rivertowne Brewing Company)" +"1750",1750,0.048,NA,1878,"OH-PA Session Pale Ale","American Pale Ale (APA)",43,12,"American Pale Ale (APA)",44,"Rivertowne Brewing Company","Export","PA","OH-PA Session Pale Ale (Rivertowne Brewing Company)" +"1751",1751,0.08,NA,1877,"Patrick's Poison","American Amber / Red Ale",43,12,"American Amber / Red Ale",44,"Rivertowne Brewing Company","Export","PA","Patrick's Poison (Rivertowne Brewing Company)" +"1752",1752,0.081,NA,1764,"Rudolph's Red","American Amber / Red Ale",43,12,"American Amber / Red Ale",44,"Rivertowne Brewing Company","Export","PA","Rudolph's Red (Rivertowne Brewing Company)" +"1753",1753,0.053,NA,1103,"Babbling Blonde","American Blonde Ale",43,12,"American Blonde Ale",44,"Rivertowne Brewing Company","Export","PA","Babbling Blonde (Rivertowne Brewing Company)" +"1754",1754,0.051,NA,1102,"Maxwell's Scottish Ale","Scottish Ale",43,12,NA,44,"Rivertowne Brewing Company","Export","PA","Maxwell's Scottish Ale (Rivertowne Brewing Company)" +"1755",1755,0.061,NA,1101,"Grateful White","Witbier",43,12,NA,44,"Rivertowne Brewing Company","Export","PA","Grateful White (Rivertowne Brewing Company)" +"1756",1756,0.055,NA,1100,"RT Lager","American Amber / Red Lager",43,12,NA,44,"Rivertowne Brewing Company","Export","PA","RT Lager (Rivertowne Brewing Company)" +"1757",1757,0.062,NA,1099,"Old Wylie's IPA","American IPA",43,12,"American IPA",44,"Rivertowne Brewing Company","Export","PA","Old Wylie's IPA (Rivertowne Brewing Company)" +"1758",1758,0.048,NA,1098,"Hala Kahiki Pineapple Beer","Fruit / Vegetable Beer",43,12,NA,44,"Rivertowne Brewing Company","Export","PA","Hala Kahiki Pineapple Beer (Rivertowne Brewing Company)" +"1759",1759,0.045,NA,1330,"Track 1 Amber Lager","American Amber / Red Lager",427,16,NA,428,"Roanoke Railhouse Brewery","Roanoke","VA","Track 1 Amber Lager (Roanoke Railhouse Brewery)" +"1760",1760,0.053,NA,2074,"Pine Knob Pilsner","Czech Pilsener",229,16,NA,230,"Rochester Mills Brewing Company","Rochester","MI","Pine Knob Pilsner (Rochester Mills Brewing Company)" +"1761",1761,NA,NA,1724,"Cal and Co. Black Cherry Porter","American Porter",229,16,NA,230,"Rochester Mills Brewing Company","Rochester","MI","Cal and Co. Black Cherry Porter (Rochester Mills Brewing Company)" +"1762",1762,0.055,NA,1280,"Lazy Daze Lager","American Adjunct Lager",229,16,NA,230,"Rochester Mills Brewing Company","Rochester","MI","Lazy Daze Lager (Rochester Mills Brewing Company)" +"1763",1763,0.059,NA,899,"Rochester Red Ale","American Amber / Red Ale",229,16,"American Amber / Red Ale",230,"Rochester Mills Brewing Company","Rochester","MI","Rochester Red Ale (Rochester Mills Brewing Company)" +"1764",1764,0.05,NA,363,"Milkshake Stout","Milk / Sweet Stout",229,16,NA,230,"Rochester Mills Brewing Company","Rochester","MI","Milkshake Stout (Rochester Mills Brewing Company)" +"1765",1765,0.07,NA,158,"Cornerstone IPA","American IPA",229,16,"American IPA",230,"Rochester Mills Brewing Company","Rochester","MI","Cornerstone IPA (Rochester Mills Brewing Company)" +"1766",1766,0.055,NA,97,"Lazy Daze Lager","American Adjunct Lager",229,12,NA,230,"Rochester Mills Brewing Company","Rochester","MI","Lazy Daze Lager (Rochester Mills Brewing Company)" +"1767",1767,0.051,NA,1860,"Rogue American Amber Ale","American Amber / Red Ale",289,16,"American Amber / Red Ale",290,"Rogue Ales","Newport","OR","Rogue American Amber Ale (Rogue Ales)" +"1768",1768,0.076,78,1577,"12th Round","American Strong Ale",376,16,NA,377,"RoughTail Brewing Company","Midwest City","OK","12th Round (RoughTail Brewing Company)" +"1769",1769,0.07,80,1576,"RoughTail IPA","American IPA",376,16,"American IPA",377,"RoughTail Brewing Company","Midwest City","OK","RoughTail IPA (RoughTail Brewing Company)" +"1770",1770,0.08,NA,1575,"Polar Night Stout","American Stout",376,16,NA,377,"RoughTail Brewing Company","Midwest City","OK","Polar Night Stout (RoughTail Brewing Company)" +"1771",1771,0.071,36,2304,"Sundown","Saison / Farmhouse Ale",164,12,NA,165,"Round Guys Brewing","Lansdale","PA","Sundown (Round Guys Brewing)" +"1772",1772,0.099,NA,2249,"Sanctified","Belgian Strong Pale Ale",164,12,NA,165,"Round Guys Brewing","Lansdale","PA","Sanctified (Round Guys Brewing)" +"1773",1773,0.051,NA,2053,"Fear of a Brett Planet","American Pale Ale (APA)",164,12,"American Pale Ale (APA)",165,"Round Guys Brewing","Lansdale","PA","Fear of a Brett Planet (Round Guys Brewing)" +"1774",1774,0.0559999999999999,40,1842,"Original Slacker Ale","English Brown Ale",164,12,NA,165,"Round Guys Brewing","Lansdale","PA","Original Slacker Ale (Round Guys Brewing)" +"1775",1775,0.072,NA,1841,"Alpha Blackback","American Black Ale",164,12,NA,165,"Round Guys Brewing","Lansdale","PA","Alpha Blackback (Round Guys Brewing)" +"1776",1776,0.063,NA,1782,"Kiss Off IPA","American IPA",164,12,"American IPA",165,"Round Guys Brewing","Lansdale","PA","Kiss Off IPA (Round Guys Brewing)" +"1777",1777,0.045,28,1552,"Dog Days Summer Ale","Kölsch",164,12,NA,165,"Round Guys Brewing","Lansdale","PA","Dog Days Summer Ale (Round Guys Brewing)" +"1778",1778,0.0559999999999999,35,1479,"1881 California Red","American Amber / Red Ale",397,12,"American Amber / Red Ale",398,"Ruhstaller Beer Company","Sacramento","CA","1881 California Red (Ruhstaller Beer Company)" +"1779",1779,0.073,55,1478,"CAPT Black IPA","American Black Ale",397,12,NA,398,"Ruhstaller Beer Company","Sacramento","CA","CAPT Black IPA (Ruhstaller Beer Company)" +"1780",1780,0.048,42,1370,"Ruhstaller's Gilt Edge Lager Beer","American Amber / Red Lager",397,12,NA,398,"Ruhstaller Beer Company","Sacramento","CA","Ruhstaller's Gilt Edge Lager Beer (Ruhstaller Beer Company)" +"1781",1781,0.073,55,883,"CAPT Black IPA","American Black Ale",397,16,NA,398,"Ruhstaller Beer Company","Sacramento","CA","CAPT Black IPA (Ruhstaller Beer Company)" +"1782",1782,0.0559999999999999,35,882,"1881 California Red Ale","American Amber / Red Ale",397,16,"American Amber / Red Ale",398,"Ruhstaller Beer Company","Sacramento","CA","1881 California Red Ale (Ruhstaller Beer Company)" +"1783",1783,0.05,15,1868,"Saint Archer White Ale","Witbier",288,12,NA,289,"Saint Archer Brewery","San Diego","CA","Saint Archer White Ale (Saint Archer Brewery)" +"1784",1784,0.068,66,1867,"Saint Archer IPA","American IPA",288,12,"American IPA",289,"Saint Archer Brewery","San Diego","CA","Saint Archer IPA (Saint Archer Brewery)" +"1785",1785,0.052,40,1865,"Saint Archer Pale Ale","American Pale Ale (APA)",288,12,"American Pale Ale (APA)",289,"Saint Archer Brewery","San Diego","CA","Saint Archer Pale Ale (Saint Archer Brewery)" +"1786",1786,0.048,22,1864,"Saint Archer Blonde","Kölsch",288,12,NA,289,"Saint Archer Brewery","San Diego","CA","Saint Archer Blonde (Saint Archer Brewery)" +"1787",1787,0.069,20,2599,"Sex Panther","American Porter",30,12,NA,31,"SanTan Brewing Company","Chandler","AZ","Sex Panther (SanTan Brewing Company)" +"1788",1788,0.095,25,2073,"Winter Warmer (Vault Series)","Winter Warmer",30,16,NA,31,"SanTan Brewing Company","Chandler","AZ","Winter Warmer (Vault Series) (SanTan Brewing Company)" +"1789",1789,0.091,99,2063,"Count Hopula (Vault Series)","American Double / Imperial IPA",30,16,"American Double / Imperial IPA",31,"SanTan Brewing Company","Chandler","AZ","Count Hopula (Vault Series) (SanTan Brewing Company)" +"1790",1790,0.055,NA,1995,"Oktoberfest","Märzen / Oktoberfest",30,12,NA,31,"SanTan Brewing Company","Chandler","AZ","Oktoberfest (SanTan Brewing Company)" +"1791",1791,0.05,15,1934,"SunSpot Golden Ale","American Blonde Ale",30,12,"American Blonde Ale",31,"SanTan Brewing Company","Chandler","AZ","SunSpot Golden Ale (SanTan Brewing Company)" +"1792",1792,0.06,NA,1329,"I.W.A. (2011)","American Pale Wheat Ale",30,12,"American Pale Wheat Ale",31,"SanTan Brewing Company","Chandler","AZ","I.W.A. (2011) (SanTan Brewing Company)" +"1793",1793,0.065,NA,1299,"Supermonk I.P.A.","Belgian IPA",30,12,NA,31,"SanTan Brewing Company","Chandler","AZ","Supermonk I.P.A. (SanTan Brewing Company)" +"1794",1794,0.055,20,1073,"Epicenter Amber Ale","American Amber / Red Ale",30,12,"American Amber / Red Ale",31,"SanTan Brewing Company","Chandler","AZ","Epicenter Amber Ale (SanTan Brewing Company)" +"1795",1795,0.05,15,1072,"SanTan HefeWeizen","Hefeweizen",30,12,NA,31,"SanTan Brewing Company","Chandler","AZ","SanTan HefeWeizen (SanTan Brewing Company)" +"1796",1796,0.07,85,1071,"Hop Shock IPA","American IPA",30,12,"American IPA",31,"SanTan Brewing Company","Chandler","AZ","Hop Shock IPA (SanTan Brewing Company)" +"1797",1797,0.069,20,852,"Sex Panther (2014)","American Porter",30,12,NA,31,"SanTan Brewing Company","Chandler","AZ","Sex Panther (2014) (SanTan Brewing Company)" +"1798",1798,0.055,45,850,"Devil’s Ale","American Pale Ale (APA)",30,12,"American Pale Ale (APA)",31,"SanTan Brewing Company","Chandler","AZ","Devil’s Ale (SanTan Brewing Company)" +"1799",1799,0.081,NA,839,"Rail Slide Imperial Spiced Ale","Herbed / Spiced Beer",30,12,NA,31,"SanTan Brewing Company","Chandler","AZ","Rail Slide Imperial Spiced Ale (SanTan Brewing Company)" +"1800",1800,0.05,20,777,"Mr. Pineapple","Fruit / Vegetable Beer",30,12,NA,31,"SanTan Brewing Company","Chandler","AZ","Mr. Pineapple (SanTan Brewing Company)" +"1801",1801,0.055,45,764,"American Idiot Ale (2012)","American Pale Ale (APA)",30,12,"American Pale Ale (APA)",31,"SanTan Brewing Company","Chandler","AZ","American Idiot Ale (2012) (SanTan Brewing Company)" +"1802",1802,0.07,85,317,"Hop Shock IPA (2010)","American IPA",30,12,"American IPA",31,"SanTan Brewing Company","Chandler","AZ","Hop Shock IPA (2010) (SanTan Brewing Company)" +"1803",1803,0.05,15,286,"SanTan HefeWeizen (2010)","Hefeweizen",30,12,NA,31,"SanTan Brewing Company","Chandler","AZ","SanTan HefeWeizen (2010) (SanTan Brewing Company)" +"1804",1804,0.055,45,285,"Devil’s Ale (2010)","American Pale Ale (APA)",30,12,"American Pale Ale (APA)",31,"SanTan Brewing Company","Chandler","AZ","Devil’s Ale (2010) (SanTan Brewing Company)" +"1805",1805,0.055,20,124,"Epicenter Amber Ale (2010)","American Amber / Red Ale",30,12,"American Amber / Red Ale",31,"SanTan Brewing Company","Chandler","AZ","Epicenter Amber Ale (2010) (SanTan Brewing Company)" +"1806",1806,0.0579999999999999,20,1392,"Sanitas Saison Ale","Saison / Farmhouse Ale",419,12,NA,420,"Sanitas Brewing Company","Boulder","CO","Sanitas Saison Ale (Sanitas Brewing Company)" +"1807",1807,0.068,65,1391,"Sanitas Black IPA","American Black Ale",419,12,NA,420,"Sanitas Brewing Company","Boulder","CO","Sanitas Black IPA (Sanitas Brewing Company)" +"1808",1808,0.089,88,2002,"Giant DIPA","American Double / Imperial IPA",252,16,"American Double / Imperial IPA",253,"Santa Cruz Mountain Brewing","Santa Cruz","CA","Giant DIPA (Santa Cruz Mountain Brewing)" +"1809",1809,0.054,NA,1683,"Dread Brown Ale","American Brown Ale",252,12,NA,253,"Santa Cruz Mountain Brewing","Santa Cruz","CA","Dread Brown Ale (Santa Cruz Mountain Brewing)" +"1810",1810,0.07,NA,1362,"Casinos IPA","English India Pale Ale (IPA)",252,16,NA,253,"Santa Cruz Mountain Brewing","Santa Cruz","CA","Casinos IPA (Santa Cruz Mountain Brewing)" +"1811",1811,0.055,30,1519,"Saison 88","Saison / Farmhouse Ale",392,12,NA,393,"Santa Fe Brewing Company","Santa Fe","NM","Saison 88 (Santa Fe Brewing Company)" +"1812",1812,0.071,95,967,"Black IPA","American Black Ale",392,12,NA,393,"Santa Fe Brewing Company","Santa Fe","NM","Black IPA (Santa Fe Brewing Company)" +"1813",1813,0.045,NA,599,"Santa Fe Irish Red Ale","Irish Red Ale",392,12,NA,393,"Santa Fe Brewing Company","Santa Fe","NM","Santa Fe Irish Red Ale (Santa Fe Brewing Company)" +"1814",1814,NA,NA,307,"Santa Fe Oktoberfest","Märzen / Oktoberfest",392,12,NA,393,"Santa Fe Brewing Company","Santa Fe","NM","Santa Fe Oktoberfest (Santa Fe Brewing Company)" +"1815",1815,0.08,NA,305,"Imperial Java Stout","Russian Imperial Stout",392,12,NA,393,"Santa Fe Brewing Company","Santa Fe","NM","Imperial Java Stout (Santa Fe Brewing Company)" +"1816",1816,0.055,NA,304,"Freestyle Pilsner","German Pilsener",392,12,NA,393,"Santa Fe Brewing Company","Santa Fe","NM","Freestyle Pilsner (Santa Fe Brewing Company)" +"1817",1817,0.066,NA,217,"Happy Camper IPA","American IPA",392,12,"American IPA",393,"Santa Fe Brewing Company","Santa Fe","NM","Happy Camper IPA (Santa Fe Brewing Company)" +"1818",1818,0.05,11,1477,"Oval Beach Blonde Ale","American Blonde Ale",398,16,"American Blonde Ale",399,"Saugatuck Brewing Company","Douglas","MI","Oval Beach Blonde Ale (Saugatuck Brewing Company)" +"1819",1819,0.065,NA,1503,"Oak Aged Cider","Cider",394,12,NA,395,"Schilling & Company","Seattle","WA","Oak Aged Cider (Schilling & Company)" +"1820",1820,0.065,NA,1466,"Ginger Cider","Cider",394,12,NA,395,"Schilling & Company","Seattle","WA","Ginger Cider (Schilling & Company)" +"1821",1821,0.065,NA,1245,"Schilling Hard Cider","Cider",394,12,NA,395,"Schilling & Company","Seattle","WA","Schilling Hard Cider (Schilling & Company)" +"1822",1822,0.05,45,1324,"Schlafly Yakima Wheat Ale","American Pale Wheat Ale",428,12,"American Pale Wheat Ale",429,"Schlafly Brewing Company","Saint Louis","MO","Schlafly Yakima Wheat Ale (Schlafly Brewing Company)" +"1823",1823,0.05,NA,1323,"Schlafly Black Lager","Schwarzbier",428,12,NA,429,"Schlafly Brewing Company","Saint Louis","MO","Schlafly Black Lager (Schlafly Brewing Company)" +"1824",1824,0.045,30,1078,"Schlafly IPA","American IPA",428,12,"American IPA",429,"Schlafly Brewing Company","Saint Louis","MO","Schlafly IPA (Schlafly Brewing Company)" +"1825",1825,0.05,30,1077,"Schlafly American Brown Ale","American Brown Ale",428,12,NA,429,"Schlafly Brewing Company","Saint Louis","MO","Schlafly American Brown Ale (Schlafly Brewing Company)" +"1826",1826,0.0409999999999999,16,588,"Schlafly Hefeweizen","Hefeweizen",428,12,NA,429,"Schlafly Brewing Company","Saint Louis","MO","Schlafly Hefeweizen (Schlafly Brewing Company)" +"1827",1827,0.045,17,53,"Schlafly Summer Lager","Munich Helles Lager",428,12,NA,429,"Schlafly Brewing Company","Saint Louis","MO","Schlafly Summer Lager (Schlafly Brewing Company)" +"1828",1828,0.047,NA,815,"Sea Dog Wild Blueberry Wheat Ale","Fruit / Vegetable Beer",502,12,NA,503,"Sea Dog Brewing Company","Portland","ME","Sea Dog Wild Blueberry Wheat Ale (Sea Dog Brewing Company)" +"1829",1829,0.074,60,1302,"Blur India Pale Ale","American IPA",432,12,"American IPA",433,"Seabright Brewery","Santa Cruz","CA","Blur India Pale Ale (Seabright Brewery)" +"1830",1830,0.065,NA,1416,"Dry Cider","Cider",411,16,NA,412,"Seattle Cider Company","Seattle","WA","Dry Cider (Seattle Cider Company)" +"1831",1831,0.065,NA,1415,"Dry Hard Cider","Cider",411,16,NA,412,"Seattle Cider Company","Seattle","WA","Dry Hard Cider (Seattle Cider Company)" +"1832",1832,0.07,105,918,"Frankenlou's IPA","American IPA",494,16,"American IPA",495,"Seven Brides Brewery","Silverton","OR","Frankenlou's IPA (Seven Brides Brewery)" +"1833",1833,0.07,55,917,"Becky's Black Cat Porter","American Porter",494,16,NA,495,"Seven Brides Brewery","Silverton","OR","Becky's Black Cat Porter (Seven Brides Brewery)" +"1834",1834,0.077,40,2250,"Seventh Son of a Seventh Son","American Strong Ale",183,16,NA,184,"Seventh Son Brewing Company","Columbus","OH","Seventh Son of a Seventh Son (Seventh Son Brewing Company)" +"1835",1835,0.053,20,1768,"Stone Fort Brown Ale","English Brown Ale",183,16,NA,184,"Seventh Son Brewing Company","Columbus","OH","Stone Fort Brown Ale (Seventh Son Brewing Company)" +"1836",1836,0.077,40,1767,"Seventh Son Hopped Red Ale","American Amber / Red Ale",183,16,"American Amber / Red Ale",184,"Seventh Son Brewing Company","Columbus","OH","Seventh Son Hopped Red Ale (Seventh Son Brewing Company)" +"1837",1837,0.06,53,1766,"Humulus Nimbus Super Pale Ale","American Pale Ale (APA)",183,16,"American Pale Ale (APA)",184,"Seventh Son Brewing Company","Columbus","OH","Humulus Nimbus Super Pale Ale (Seventh Son Brewing Company)" +"1838",1838,0.07,68,1765,"Golden Ratio IPA","American IPA",183,16,"American IPA",184,"Seventh Son Brewing Company","Columbus","OH","Golden Ratio IPA (Seventh Son Brewing Company)" +"1839",1839,0.068,NA,2368,"Black Hop IPA","American Black Ale",130,12,NA,131,"Shebeen Brewing Company","Wolcott","CT","Black Hop IPA (Shebeen Brewing Company)" +"1840",1840,0.05,NA,738,"Archer's Ale (2004)","English Pale Ale",511,12,NA,512,"Sherwood Forest Brewers","Marlborough","MA","Archer's Ale (2004) (Sherwood Forest Brewers)" +"1841",1841,0.069,65,1539,"Monkey Fist IPA","American IPA",385,12,"American IPA",386,"Shipyard Brewing Company","Portland","ME","Monkey Fist IPA (Shipyard Brewing Company)" +"1842",1842,0.051,NA,975,"Shipyard Summer Ale","American Pale Wheat Ale",385,12,"American Pale Wheat Ale",386,"Shipyard Brewing Company","Portland","ME","Shipyard Summer Ale (Shipyard Brewing Company)" +"1843",1843,0.047,NA,814,"Pumpkinhead Ale","Pumpkin Ale",385,12,NA,386,"Shipyard Brewing Company","Portland","ME","Pumpkinhead Ale (Shipyard Brewing Company)" +"1844",1844,0.051,NA,727,"Shipyard Export","American Blonde Ale",385,12,"American Blonde Ale",386,"Shipyard Brewing Company","Portland","ME","Shipyard Export (Shipyard Brewing Company)" +"1845",1845,0.052,NA,2474,"Nooner","German Pilsener",83,12,NA,84,"Sierra Nevada Brewing Company","Chico","CA","Nooner (Sierra Nevada Brewing Company)" +"1846",1846,0.072,65,2239,"Torpedo","American IPA",83,12,"American IPA",84,"Sierra Nevada Brewing Company","Chico","CA","Torpedo (Sierra Nevada Brewing Company)" +"1847",1847,0.06,NA,1919,"Yonder Bock","Maibock / Helles Bock",83,12,NA,84,"Sierra Nevada Brewing Company","Chico","CA","Yonder Bock (Sierra Nevada Brewing Company)" +"1848",1848,0.06,NA,1918,"CANfusion Rye Bock","Rye Beer",83,12,NA,84,"Sierra Nevada Brewing Company","Chico","CA","CANfusion Rye Bock (Sierra Nevada Brewing Company)" +"1849",1849,0.0559999999999999,37,1905,"Sierra Nevada Pale Ale","American Pale Ale (APA)",83,16,"American Pale Ale (APA)",84,"Sierra Nevada Brewing Company","Chico","CA","Sierra Nevada Pale Ale (Sierra Nevada Brewing Company)" +"1850",1850,0.048,26,1338,"Old Chico Crystal Wheat","American Pale Wheat Ale",83,12,"American Pale Wheat Ale",84,"Sierra Nevada Brewing Company","Chico","CA","Old Chico Crystal Wheat (Sierra Nevada Brewing Company)" +"1851",1851,0.05,28,1295,"Summerfest","Czech Pilsener",83,12,NA,84,"Sierra Nevada Brewing Company","Chico","CA","Summerfest (Sierra Nevada Brewing Company)" +"1852",1852,0.072,65,426,"Torpedo","American IPA",83,16,"American IPA",84,"Sierra Nevada Brewing Company","Chico","CA","Torpedo (Sierra Nevada Brewing Company)" +"1853",1853,0.0559999999999999,37,400,"Sierra Nevada Pale Ale","American Pale Ale (APA)",83,12,"American Pale Ale (APA)",84,"Sierra Nevada Brewing Company","Chico","CA","Sierra Nevada Pale Ale (Sierra Nevada Brewing Company)" +"1854",1854,0.069,NA,2353,"Sietsema Red Label","Cider",137,16,NA,138,"Sietsema Orchards and Cider Mill","Ada","MI","Sietsema Red Label (Sietsema Orchards and Cider Mill)" +"1855",1855,0.042,NA,212,"Bear Ass Brown","American Brown Ale",551,12,NA,552,"Silverton Brewery","Silverton","CO","Bear Ass Brown (Silverton Brewery)" +"1856",1856,0.06,NA,161,"Red Mountain Ale","American Amber / Red Ale",551,12,"American Amber / Red Ale",552,"Silverton Brewery","Silverton","CO","Red Mountain Ale (Silverton Brewery)" +"1857",1857,0.068,NA,160,"Ice Pick Ale","American IPA",551,12,"American IPA",552,"Silverton Brewery","Silverton","CO","Ice Pick Ale (Silverton Brewery)" +"1858",1858,0.1,52,2574,"4Beans","Baltic Porter",46,12,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","4Beans (Sixpoint Craft Ales)" +"1859",1859,0.042,16,2479,"Jammer","Gose",46,12,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Jammer (Sixpoint Craft Ales)" +"1860",1860,0.08,NA,2443,"Abigale","Belgian Pale Ale",46,12,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Abigale (Sixpoint Craft Ales)" +"1861",1861,0.032,7,2266,"Rad","Fruit / Vegetable Beer",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Rad (Sixpoint Craft Ales)" +"1862",1862,0.065,62,2090,"Bengali","American IPA",46,24,"American IPA",47,"Sixpoint Craft Ales","Brooklyn","NY","Bengali (Sixpoint Craft Ales)" +"1863",1863,0.047,50,1962,"Sensi Harvest","American Pale Ale (APA)",46,12,"American Pale Ale (APA)",47,"Sixpoint Craft Ales","Brooklyn","NY","Sensi Harvest (Sixpoint Craft Ales)" +"1864",1864,0.099,111,1696,"Hi-Res","American Double / Imperial IPA",46,12,"American Double / Imperial IPA",47,"Sixpoint Craft Ales","Brooklyn","NY","Hi-Res (Sixpoint Craft Ales)" +"1865",1865,0.07,70,1608,"Global Warmer","American Strong Ale",46,12,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Global Warmer (Sixpoint Craft Ales)" +"1866",1866,0.067,74,1591,"Autumnation (2013)","American IPA",46,16,"American IPA",47,"Sixpoint Craft Ales","Brooklyn","NY","Autumnation (2013) (Sixpoint Craft Ales)" +"1867",1867,0.054,42,1388,"The Crisp","German Pilsener",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","The Crisp (Sixpoint Craft Ales)" +"1868",1868,0.052,34,1387,"Sweet Action","Cream Ale",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Sweet Action (Sixpoint Craft Ales)" +"1869",1869,0.063,57,1386,"Righteous Ale","Rye Beer",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Righteous Ale (Sixpoint Craft Ales)" +"1870",1870,0.064,62,1385,"Bengali Tiger","American IPA",46,16,"American IPA",47,"Sixpoint Craft Ales","Brooklyn","NY","Bengali Tiger (Sixpoint Craft Ales)" +"1871",1871,0.099,85,1020,"3Beans","Baltic Porter",46,12,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","3Beans (Sixpoint Craft Ales)" +"1872",1872,0.059,47,778,"Brownstone","American Brown Ale",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Brownstone (Sixpoint Craft Ales)" +"1873",1873,0.052,11,630,"Apollo","American Pale Wheat Ale",46,16,"American Pale Wheat Ale",47,"Sixpoint Craft Ales","Brooklyn","NY","Apollo (Sixpoint Craft Ales)" +"1874",1874,0.049,35,629,"Harbinger","Saison / Farmhouse Ale",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Harbinger (Sixpoint Craft Ales)" +"1875",1875,0.091,103,628,"Resin","American Double / Imperial IPA",46,12,"American Double / Imperial IPA",47,"Sixpoint Craft Ales","Brooklyn","NY","Resin (Sixpoint Craft Ales)" +"1876",1876,0.063,69,525,"Diesel","American Stout",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Diesel (Sixpoint Craft Ales)" +"1877",1877,0.06,48,512,"Autumnation (2011-12) (2011)","Pumpkin Ale",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Autumnation (2011-12) (2011) (Sixpoint Craft Ales)" +"1878",1878,0.054,42,425,"The Crisp (2011)","German Pilsener",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","The Crisp (2011) (Sixpoint Craft Ales)" +"1879",1879,0.052,34,424,"Sweet Action (2011)","Cream Ale",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Sweet Action (2011) (Sixpoint Craft Ales)" +"1880",1880,0.063,57,423,"Righteous Ale (2011)","Rye Beer",46,16,NA,47,"Sixpoint Craft Ales","Brooklyn","NY","Righteous Ale (2011) (Sixpoint Craft Ales)" +"1881",1881,0.064,62,422,"Bengali Tiger (2011)","American IPA",46,16,"American IPA",47,"Sixpoint Craft Ales","Brooklyn","NY","Bengali Tiger (2011) (Sixpoint Craft Ales)" +"1882",1882,0.045,NA,1942,"Rudie Session IPA","American IPA",264,12,"American IPA",265,"Ska Brewing Company","Durango","CO","Rudie Session IPA (Ska Brewing Company)" +"1883",1883,0.074,NA,1708,"Taster's Choice","Doppelbock",264,12,NA,265,"Ska Brewing Company","Durango","CO","Taster's Choice (Ska Brewing Company)" +"1884",1884,0.068,65,1521,"Modus Hoperandi","American IPA",264,12,"American IPA",265,"Ska Brewing Company","Durango","CO","Modus Hoperandi (Ska Brewing Company)" +"1885",1885,0.0579999999999999,15,1297,"Estival Cream Stout","American Stout",264,12,NA,265,"Ska Brewing Company","Durango","CO","Estival Cream Stout (Ska Brewing Company)" +"1886",1886,0.0579999999999999,NA,1192,"Vernal Minthe Stout","American Stout",264,12,NA,265,"Ska Brewing Company","Durango","CO","Vernal Minthe Stout (Ska Brewing Company)" +"1887",1887,0.08,NA,1013,"Hibernal Vinifera Stout","Foreign / Export Stout",264,12,NA,265,"Ska Brewing Company","Durango","CO","Hibernal Vinifera Stout (Ska Brewing Company)" +"1888",1888,NA,NA,774,"Autumnal Molé Stout","American Stout",264,12,NA,265,"Ska Brewing Company","Durango","CO","Autumnal Molé Stout (Ska Brewing Company)" +"1889",1889,0.042,18,386,"Mexican Logger","American Pale Lager",264,12,NA,265,"Ska Brewing Company","Durango","CO","Mexican Logger (Ska Brewing Company)" +"1890",1890,0.053,NA,70,"True Blonde Ale","American Blonde Ale",264,12,"American Blonde Ale",265,"Ska Brewing Company","Durango","CO","True Blonde Ale (Ska Brewing Company)" +"1891",1891,0.061,NA,69,"Euphoria Pale Ale","American Pale Ale (APA)",264,12,"American Pale Ale (APA)",265,"Ska Brewing Company","Durango","CO","Euphoria Pale Ale (Ska Brewing Company)" +"1892",1892,0.057,58,68,"ESB Special Ale","Extra Special / Strong Bitter (ESB)",264,12,NA,265,"Ska Brewing Company","Durango","CO","ESB Special Ale (Ska Brewing Company)" +"1893",1893,0.068,65,67,"Modus Hoperandi","American IPA",264,12,"American IPA",265,"Ska Brewing Company","Durango","CO","Modus Hoperandi (Ska Brewing Company)" +"1894",1894,0.0579999999999999,39,1792,"Iron Butt Red Ale","American Amber / Red Ale",313,12,"American Amber / Red Ale",314,"Slanted Rock Brewing Company","Meridian","ID","Iron Butt Red Ale (Slanted Rock Brewing Company)" +"1895",1895,0.071,92,1609,"Initial Point India Pale Ale","American IPA",313,12,"American IPA",314,"Slanted Rock Brewing Company","Meridian","ID","Initial Point India Pale Ale (Slanted Rock Brewing Company)" +"1896",1896,0.085,NA,2537,"Monkey Dancing On A Razor Blade","Belgian IPA",64,24,NA,65,"SlapShot Brewing Company","Chicago","IL","Monkey Dancing On A Razor Blade (SlapShot Brewing Company)" +"1897",1897,0.0819999999999999,NA,2536,"Tripel Deke","Tripel",64,24,NA,65,"SlapShot Brewing Company","Chicago","IL","Tripel Deke (SlapShot Brewing Company)" +"1898",1898,0.049,NA,30,"Urban Wilderness Pale Ale","English Pale Ale",557,12,NA,558,"Sleeping Lady Brewing Company","Anchorage","AK","Urban Wilderness Pale Ale (Sleeping Lady Brewing Company)" +"1899",1899,0.06,70,2305,"Homefront IPA","American IPA",163,12,"American IPA",164,"Sly Fox Brewing Company","Phoenixville","PA","Homefront IPA (Sly Fox Brewing Company)" +"1900",1900,0.055,16,1588,"Sly Fox Christmas Ale 2013","Winter Warmer",371,12,NA,372,"Sly Fox Brewing Company","Pottstown","PA","Sly Fox Christmas Ale 2013 (Sly Fox Brewing Company)" +"1901",1901,0.0559999999999999,25,1363,"Grisette","Grisette",371,12,NA,372,"Sly Fox Brewing Company","Pottstown","PA","Grisette (Sly Fox Brewing Company)" +"1902",1902,0.062,NA,1211,"360° India Pale Ale","American IPA",371,12,"American IPA",372,"Sly Fox Brewing Company","Pottstown","PA","360° India Pale Ale (Sly Fox Brewing Company)" +"1903",1903,0.049,18,1123,"Helles Golden Lager","Munich Helles Lager",371,12,NA,372,"Sly Fox Brewing Company","Pottstown","PA","Helles Golden Lager (Sly Fox Brewing Company)" +"1904",1904,0.055,16,926,"Sly Fox Christmas Ale 2012 (2012)","Winter Warmer",371,12,NA,372,"Sly Fox Brewing Company","Pottstown","PA","Sly Fox Christmas Ale 2012 (2012) (Sly Fox Brewing Company)" +"1905",1905,0.084,90,894,"Odyssey Imperial IPA","American Double / Imperial IPA",371,12,"American Double / Imperial IPA",372,"Sly Fox Brewing Company","Pottstown","PA","Odyssey Imperial IPA (Sly Fox Brewing Company)" +"1906",1906,0.0579999999999999,25,166,"Oktoberfest Lager","Märzen / Oktoberfest",371,12,NA,372,"Sly Fox Brewing Company","Pottstown","PA","Oktoberfest Lager (Sly Fox Brewing Company)" +"1907",1907,0.07,113,24,"113 IPA","American IPA",371,12,"American IPA",372,"Sly Fox Brewing Company","Pottstown","PA","113 IPA (Sly Fox Brewing Company)" +"1908",1908,0.053,21,23,"Dunkel Lager","Munich Dunkel Lager",371,12,NA,372,"Sly Fox Brewing Company","Pottstown","PA","Dunkel Lager (Sly Fox Brewing Company)" +"1909",1909,0.0559999999999999,11,22,"Royal Weisse Ale","Hefeweizen",371,12,NA,372,"Sly Fox Brewing Company","Pottstown","PA","Royal Weisse Ale (Sly Fox Brewing Company)" +"1910",1910,0.049,44,21,"Pikeland Pils","German Pilsener",371,12,NA,372,"Sly Fox Brewing Company","Pottstown","PA","Pikeland Pils (Sly Fox Brewing Company)" +"1911",1911,0.051,40,20,"Phoenix Pale Ale","American Pale Ale (APA)",371,12,"American Pale Ale (APA)",372,"Sly Fox Brewing Company","Pottstown","PA","Phoenix Pale Ale (Sly Fox Brewing Company)" +"1912",1912,0.07,88,2407,"Rule G IPA","American IPA",115,12,"American IPA",116,"Smartmouth Brewing Company","Norfolk","VA","Rule G IPA (Smartmouth Brewing Company)" +"1913",1913,0.0579999999999999,35,2406,"Murphy's Law","American Amber / Red Ale",115,12,"American Amber / Red Ale",116,"Smartmouth Brewing Company","Norfolk","VA","Murphy's Law (Smartmouth Brewing Company)" +"1914",1914,0.062,33,2405,"Alter Ego","Saison / Farmhouse Ale",115,12,NA,116,"Smartmouth Brewing Company","Norfolk","VA","Alter Ego (Smartmouth Brewing Company)" +"1915",1915,0.05,NA,2234,"Monarch Pilsner","American Pilsner",191,12,NA,192,"Snake River Brewing Company","Jackson","WY","Monarch Pilsner (Snake River Brewing Company)" +"1916",1916,0.06,55,1606,"Snow King Pale Ale","American Pale Ale (APA)",191,12,"American Pale Ale (APA)",192,"Snake River Brewing Company","Jackson","WY","Snow King Pale Ale (Snake River Brewing Company)" +"1917",1917,0.054,36,617,"Zonker Stout","Foreign / Export Stout",191,12,NA,192,"Snake River Brewing Company","Jackson","WY","Zonker Stout (Snake River Brewing Company)" +"1918",1918,0.05,22,407,"OB-1 Organic Ale","English Brown Ale",191,12,NA,192,"Snake River Brewing Company","Jackson","WY","OB-1 Organic Ale (Snake River Brewing Company)" +"1919",1919,0.05,18,406,"Snake River Lager","Vienna Lager",191,12,NA,192,"Snake River Brewing Company","Jackson","WY","Snake River Lager (Snake River Brewing Company)" +"1920",1920,0.052,32,402,"Snake River Pale Ale","American Pale Ale (APA)",191,12,"American Pale Ale (APA)",192,"Snake River Brewing Company","Jackson","WY","Snake River Pale Ale (Snake River Brewing Company)" +"1921",1921,0.068,60,393,"Pako’s EyePA","American IPA",191,12,"American IPA",192,"Snake River Brewing Company","Jackson","WY","Pako’s EyePA (Snake River Brewing Company)" +"1922",1922,0.05,NA,1798,"Thanksgiving Ale","Kölsch",309,12,NA,310,"Sockeye Brewing Company","Boise","ID","Thanksgiving Ale (Sockeye Brewing Company)" +"1923",1923,0.092,NA,1655,"Double Dagger Imperial IPA","American Double / Imperial IPA",309,12,"American Double / Imperial IPA",310,"Sockeye Brewing Company","Boise","ID","Double Dagger Imperial IPA (Sockeye Brewing Company)" +"1924",1924,0.063,100,1596,"Dagger Falls IPA","American IPA",309,12,"American IPA",310,"Sockeye Brewing Company","Boise","ID","Dagger Falls IPA (Sockeye Brewing Company)" +"1925",1925,0.063,100,1595,"Dagger Falls IPA","American IPA",309,12,"American IPA",310,"Sockeye Brewing Company","Boise","ID","Dagger Falls IPA (Sockeye Brewing Company)" +"1926",1926,0.06,NA,1482,"Socktoberfest","Märzen / Oktoberfest",309,16,NA,310,"Sockeye Brewing Company","Boise","ID","Socktoberfest (Sockeye Brewing Company)" +"1927",1927,0.079,NA,1447,"Hopnoxious Imperial IPA","American Double / Imperial IPA",309,12,"American Double / Imperial IPA",310,"Sockeye Brewing Company","Boise","ID","Hopnoxious Imperial IPA (Sockeye Brewing Company)" +"1928",1928,0.099,NA,1425,"Barrel Aged Seven Devils Imperial Stout","American Double / Imperial Stout",309,12,NA,310,"Sockeye Brewing Company","Boise","ID","Barrel Aged Seven Devils Imperial Stout (Sockeye Brewing Company)" +"1929",1929,0.055,NA,1424,"Boise Co-Op Two Score Ale","Saison / Farmhouse Ale",309,16,NA,310,"Sockeye Brewing Company","Boise","ID","Boise Co-Op Two Score Ale (Sockeye Brewing Company)" +"1930",1930,0.05,NA,1298,"Sockeye Belgian Style Summer Ale","Witbier",309,16,NA,310,"Sockeye Brewing Company","Boise","ID","Sockeye Belgian Style Summer Ale (Sockeye Brewing Company)" +"1931",1931,0.064,NA,1181,"Sockeye Maibock","Maibock / Helles Bock",309,12,NA,310,"Sockeye Brewing Company","Boise","ID","Sockeye Maibock (Sockeye Brewing Company)" +"1932",1932,0.099,100,1160,"Old Devil's Tooth","American Barleywine",309,12,NA,310,"Sockeye Brewing Company","Boise","ID","Old Devil's Tooth (Sockeye Brewing Company)" +"1933",1933,0.043,NA,1152,"Galena Golden","American Blonde Ale",309,12,"American Blonde Ale",310,"Sockeye Brewing Company","Boise","ID","Galena Golden (Sockeye Brewing Company)" +"1934",1934,0.052,32,1151,"Hell-Diver Pale Ale","American Pale Ale (APA)",309,12,"American Pale Ale (APA)",310,"Sockeye Brewing Company","Boise","ID","Hell-Diver Pale Ale (Sockeye Brewing Company)" +"1935",1935,0.046,12,1150,"Woolybugger Wheat","American Pale Wheat Ale",309,12,"American Pale Wheat Ale",310,"Sockeye Brewing Company","Boise","ID","Woolybugger Wheat (Sockeye Brewing Company)" +"1936",1936,0.057,NA,1076,"Power House Porter","American Porter",309,12,NA,310,"Sockeye Brewing Company","Boise","ID","Power House Porter (Sockeye Brewing Company)" +"1937",1937,0.084,90,995,"Winterfest","American Strong Ale",309,16,NA,310,"Sockeye Brewing Company","Boise","ID","Winterfest (Sockeye Brewing Company)" +"1938",1938,0.063,100,879,"Dagger Falls IPA","American IPA",309,12,"American IPA",310,"Sockeye Brewing Company","Boise","ID","Dagger Falls IPA (Sockeye Brewing Company)" +"1939",1939,0.07,18,1972,"LuckenBock","Bock",257,16,NA,258,"South Austin Brewery","South Austin","TX","LuckenBock (South Austin Brewery)" +"1940",1940,0.055,40,1971,"Texas Pale Ale (TPA)","American IPA",257,16,"American IPA",258,"South Austin Brewery","South Austin","TX","Texas Pale Ale (TPA) (South Austin Brewery)" +"1941",1941,0.08,NA,1970,"6 String Saison","Saison / Farmhouse Ale",257,16,NA,258,"South Austin Brewery","South Austin","TX","6 String Saison (South Austin Brewery)" +"1942",1942,0.05,22,1969,"Kol' Beer","Kölsch",257,16,NA,258,"South Austin Brewery","South Austin","TX","Kol' Beer (South Austin Brewery)" +"1943",1943,0.035,NA,2024,"Montauk Light","Light Lager",249,12,NA,250,"Southampton Publick House","Southampton","NY","Montauk Light (Southampton Publick House)" +"1944",1944,0.048,32,1283,"Na Zdraví Pilsner","Czech Pilsener",436,16,NA,437,"Southern Oregon Brewing Company","Medford","OR","Na Zdraví Pilsner (Southern Oregon Brewing Company)" +"1945",1945,0.055,65,1282,"Nice Rack IPA","American IPA",436,16,"American IPA",437,"Southern Oregon Brewing Company","Medford","OR","Nice Rack IPA (Southern Oregon Brewing Company)" +"1946",1946,0.075,72,2362,"2014 IPA Cicada Series","American IPA",133,16,"American IPA",134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","2014 IPA Cicada Series (Southern Prohibition Brewing Com...)" +"1947",1947,0.077,65,2346,"Sinister Minister Black IPA","American IPA",133,16,"American IPA",134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","Sinister Minister Black IPA (Southern Prohibition Brewing Com...)" +"1948",1948,0.053,45,2320,"Jack the Sipper","Extra Special / Strong Bitter (ESB)",133,12,NA,134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","Jack the Sipper (Southern Prohibition Brewing Com...)" +"1949",1949,0.0579999999999999,60,2297,"Devil's Harvest Extra Pale Ale","American Pale Ale (APA)",133,12,"American Pale Ale (APA)",134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","Devil's Harvest Extra Pale Ale (Southern Prohibition Brewing Com...)" +"1950",1950,0.05,20,2296,"Suzy B Dirty Blonde Ale","American Blonde Ale",133,12,"American Blonde Ale",134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","Suzy B Dirty Blonde Ale (Southern Prohibition Brewing Com...)" +"1951",1951,0.08,80,1745,"Mississippi Fire Ant","American Amber / Red Ale",133,16,"American Amber / Red Ale",134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","Mississippi Fire Ant (Southern Prohibition Brewing Com...)" +"1952",1952,0.0579999999999999,40,1120,"Hipster Breakfast","Oatmeal Stout",133,16,NA,134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","Hipster Breakfast (Southern Prohibition Brewing Com...)" +"1953",1953,0.05,20,1118,"Suzy B Dirty Blonde Ale","American Blonde Ale",133,16,"American Blonde Ale",134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","Suzy B Dirty Blonde Ale (Southern Prohibition Brewing Com...)" +"1954",1954,0.0579999999999999,60,1117,"Devil's Harvest Extra Pale Ale","American Pale Ale (APA)",133,16,"American Pale Ale (APA)",134,"Southern Prohibition Brewing Com...","Hattiesburg","MS","Devil's Harvest Extra Pale Ale (Southern Prohibition Brewing Com...)" +"1955",1955,0.065,45,2387,"Pine Belt Pale Ale","American Pale Ale (APA)",118,12,"American Pale Ale (APA)",119,"Southern Star Brewing Company","Conroe","TX","Pine Belt Pale Ale (Southern Star Brewing Company)" +"1956",1956,0.055,NA,2267,"Walloon","Saison / Farmhouse Ale",118,12,NA,119,"Southern Star Brewing Company","Conroe","TX","Walloon (Southern Star Brewing Company)" +"1957",1957,0.069,23,1740,"Le Mort Vivant","Bière de Garde",118,12,NA,119,"Southern Star Brewing Company","Conroe","TX","Le Mort Vivant (Southern Star Brewing Company)" +"1958",1958,0.085,110,1728,"Red Cockaded Ale","American Double / Imperial IPA",118,12,"American Double / Imperial IPA",119,"Southern Star Brewing Company","Conroe","TX","Red Cockaded Ale (Southern Star Brewing Company)" +"1959",1959,0.092,100,1497,"Valkyrie Double IPA","American Double / Imperial IPA",118,12,"American Double / Imperial IPA",119,"Southern Star Brewing Company","Conroe","TX","Valkyrie Double IPA (Southern Star Brewing Company)" +"1960",1960,0.085,110,1011,"Red Cockaded Ale (2013)","American Double / Imperial IPA",118,12,"American Double / Imperial IPA",119,"Southern Star Brewing Company","Conroe","TX","Red Cockaded Ale (2013) (Southern Star Brewing Company)" +"1961",1961,0.072,40,1010,"Old Potentate","Old Ale",118,12,NA,119,"Southern Star Brewing Company","Conroe","TX","Old Potentate (Southern Star Brewing Company)" +"1962",1962,0.05,20,856,"Bombshell Blonde","American Blonde Ale",118,16,"American Blonde Ale",119,"Southern Star Brewing Company","Conroe","TX","Bombshell Blonde (Southern Star Brewing Company)" +"1963",1963,0.099,100,853,"PRO-AM (2012) (2012)","American Double / Imperial IPA",118,12,"American Double / Imperial IPA",119,"Southern Star Brewing Company","Conroe","TX","PRO-AM (2012) (2012) (Southern Star Brewing Company)" +"1964",1964,0.055,NA,691,"Walloon (2014)","Saison / Farmhouse Ale",118,12,NA,119,"Southern Star Brewing Company","Conroe","TX","Walloon (2014) (Southern Star Brewing Company)" +"1965",1965,0.069,23,555,"Le Mort Vivant (2011)","Bière de Garde",118,12,NA,119,"Southern Star Brewing Company","Conroe","TX","Le Mort Vivant (2011) (Southern Star Brewing Company)" +"1966",1966,0.083,50,46,"Buried Hatchet Stout","Foreign / Export Stout",118,12,NA,119,"Southern Star Brewing Company","Conroe","TX","Buried Hatchet Stout (Southern Star Brewing Company)" +"1967",1967,0.065,45,45,"Pine Belt Pale Ale","American Pale Ale (APA)",118,16,"American Pale Ale (APA)",119,"Southern Star Brewing Company","Conroe","TX","Pine Belt Pale Ale (Southern Star Brewing Company)" +"1968",1968,0.05,20,44,"Bombshell Blonde","American Blonde Ale",118,12,"American Blonde Ale",119,"Southern Star Brewing Company","Conroe","TX","Bombshell Blonde (Southern Star Brewing Company)" +"1969",1969,0.047,35,2486,"Baby Daddy Session IPA","American IPA",78,12,"American IPA",79,"Speakasy Ales & Lagers","San Francisco","CA","Baby Daddy Session IPA (Speakasy Ales & Lagers)" +"1970",1970,NA,NA,763,"Hopluia (2004)","English India Pale Ale (IPA)",508,16,NA,509,"Spilker Ales","Cortland","NE","Hopluia (2004) (Spilker Ales)" +"1971",1971,0.0579999999999999,NA,2271,"Ball & Chain (2014)","American Pale Ale (APA)",175,16,"American Pale Ale (APA)",176,"Spiteful Brewing Company","Chicago","IL","Ball & Chain (2014) (Spiteful Brewing Company)" +"1972",1972,0.096,NA,2206,"Bitter Biker Double IPA","American Double / Imperial IPA",175,16,"American Double / Imperial IPA",176,"Spiteful Brewing Company","Chicago","IL","Bitter Biker Double IPA (Spiteful Brewing Company)" +"1973",1973,0.0819999999999999,NA,2136,"God Damn Pigeon Porter","American Porter",175,16,NA,176,"Spiteful Brewing Company","Chicago","IL","God Damn Pigeon Porter (Spiteful Brewing Company)" +"1974",1974,0.079,NA,2135,"Working for the Weekend","American Double / Imperial IPA",175,16,"American Double / Imperial IPA",176,"Spiteful Brewing Company","Chicago","IL","Working for the Weekend (Spiteful Brewing Company)" +"1975",1975,0.06,NA,2134,"Angry Adam","American Amber / Red Ale",175,16,"American Amber / Red Ale",176,"Spiteful Brewing Company","Chicago","IL","Angry Adam (Spiteful Brewing Company)" +"1976",1976,0.055,NA,2109,"Freedom Fries","American Stout",175,16,NA,176,"Spiteful Brewing Company","Chicago","IL","Freedom Fries (Spiteful Brewing Company)" +"1977",1977,0.096,NA,1821,"Bitter Biker Double IPA","American Double / Imperial IPA",175,12,"American Double / Imperial IPA",176,"Spiteful Brewing Company","Chicago","IL","Bitter Biker Double IPA (Spiteful Brewing Company)" +"1978",1978,0.073,NA,1820,"Ghost Bike Pale Ale","American Pale Ale (APA)",175,16,"American Pale Ale (APA)",176,"Spiteful Brewing Company","Chicago","IL","Ghost Bike Pale Ale (Spiteful Brewing Company)" +"1979",1979,0.062,NA,1819,"Spiteful IPA","American IPA",175,12,"American IPA",176,"Spiteful Brewing Company","Chicago","IL","Spiteful IPA (Spiteful Brewing Company)" +"1980",1980,0.06,NA,1634,"Alley Time","American Pale Ale (APA)",175,12,"American Pale Ale (APA)",176,"Spiteful Brewing Company","Chicago","IL","Alley Time (Spiteful Brewing Company)" +"1981",1981,0.0579999999999999,NA,1633,"Fat Badger","Irish Red Ale",175,12,NA,176,"Spiteful Brewing Company","Chicago","IL","Fat Badger (Spiteful Brewing Company)" +"1982",1982,0.055,NA,1632,"In the Weeds","American Pale Wheat Ale",175,12,"American Pale Wheat Ale",176,"Spiteful Brewing Company","Chicago","IL","In the Weeds (Spiteful Brewing Company)" +"1983",1983,0.05,22,855,"Special Amber","Vienna Lager",498,12,NA,499,"Sprecher Brewing Company","Glendale","WI","Special Amber (Sprecher Brewing Company)" +"1984",1984,0.05,22,445,"Special Amber","Vienna Lager",498,12,NA,499,"Sprecher Brewing Company","Glendale","WI","Special Amber (Sprecher Brewing Company)" +"1985",1985,0.0559999999999999,NA,1587,"Seven Gates Pale Ale","American Pale Ale (APA)",372,12,"American Pale Ale (APA)",373,"Spring House Brewing Company","Conestoga","PA","Seven Gates Pale Ale (Spring House Brewing Company)" +"1986",1986,0.052,NA,2242,"Gunga Din","Cider",186,16,NA,187,"St. Julian Winery","Paw Paw","MI","Gunga Din (St. Julian Winery)" +"1987",1987,0.042,20,1544,"Starr Pils","German Pilsener",383,12,NA,384,"Starr Hill Brewery","Crozet","VA","Starr Pils (Starr Hill Brewery)" +"1988",1988,0.065,52,1205,"Northern Lights India Pale Ale","American IPA",383,16,"American IPA",384,"Starr Hill Brewery","Crozet","VA","Northern Lights India Pale Ale (Starr Hill Brewery)" +"1989",1989,0.048,12,369,"Festie","Märzen / Oktoberfest",383,12,NA,384,"Starr Hill Brewery","Crozet","VA","Festie (Starr Hill Brewery)" +"1990",1990,0.065,52,368,"Northern Lights India Pale Ale","American IPA",383,12,"American IPA",384,"Starr Hill Brewery","Crozet","VA","Northern Lights India Pale Ale (Starr Hill Brewery)" +"1991",1991,0.065,65,2386,"Third Eye Enlightened Pale Ale","American Pale Ale (APA)",119,12,"American Pale Ale (APA)",120,"Steamworks Brewing Company","Durango","CO","Third Eye Enlightened Pale Ale (Steamworks Brewing Company)" +"1992",1992,0.049,17,92,"Colorado Kölsch","Kölsch",119,12,NA,120,"Steamworks Brewing Company","Durango","CO","Colorado Kölsch (Steamworks Brewing Company)" +"1993",1993,0.057,25,91,"Steam Engine Lager","American Amber / Red Lager",119,12,NA,120,"Steamworks Brewing Company","Durango","CO","Steam Engine Lager (Steamworks Brewing Company)" +"1994",1994,0.065,65,90,"Third Eye Pale Ale","American IPA",119,12,"American IPA",120,"Steamworks Brewing Company","Durango","CO","Third Eye Pale Ale (Steamworks Brewing Company)" +"1995",1995,0.047,9,2366,"Point Special (Current)","American Adjunct Lager",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Special (Current) (Stevens Point Brewery)" +"1996",1996,0.047,9,2365,"Point Special","American Adjunct Lager",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Special (Stevens Point Brewery)" +"1997",1997,0.054,33,2270,"Point Cascade Pale Ale (2013)","American Pale Ale (APA)",131,12,"American Pale Ale (APA)",132,"Stevens Point Brewery","Stevens Point","WI","Point Cascade Pale Ale (2013) (Stevens Point Brewery)" +"1998",1998,0.047,9,2228,"Point Special","American Adjunct Lager",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Special (Stevens Point Brewery)" +"1999",1999,0.052,9,2151,"Onyx Black Ale","American Black Ale",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Onyx Black Ale (Stevens Point Brewery)" +"2000",2000,0.063,64,2150,"Beyond The Pale IPA","American IPA",131,12,"American IPA",132,"Stevens Point Brewery","Stevens Point","WI","Beyond The Pale IPA (Stevens Point Brewery)" +"2001",2001,0.047,9,2122,"Point Special (2013)","American Adjunct Lager",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Special (2013) (Stevens Point Brewery)" +"2002",2002,0.047,9,2121,"Point Special (2012)","American Adjunct Lager",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Special (2012) (Stevens Point Brewery)" +"2003",2003,0.047,9,2115,"Point Special Lager","American Adjunct Lager",131,16,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Special Lager (Stevens Point Brewery)" +"2004",2004,0.062,NA,1450,"St. Benedict's Winter Ale","Winter Warmer",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","St. Benedict's Winter Ale (Stevens Point Brewery)" +"2005",2005,0.057,15,1357,"Point Oktoberfest","Märzen / Oktoberfest",131,16,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Oktoberfest (Stevens Point Brewery)" +"2006",2006,0.052,7,1225,"Point Nude Beach Summer Wheat","American Pale Wheat Ale",131,16,"American Pale Wheat Ale",132,"Stevens Point Brewery","Stevens Point","WI","Point Nude Beach Summer Wheat (Stevens Point Brewery)" +"2007",2007,0.05,7,816,"Point Nude Beach Summer Wheat","American Pale Wheat Ale",131,12,"American Pale Wheat Ale",132,"Stevens Point Brewery","Stevens Point","WI","Point Nude Beach Summer Wheat (Stevens Point Brewery)" +"2008",2008,0.05,7,772,"Point Nude Beach Summer Wheat (2011)","American Pale Wheat Ale",131,12,"American Pale Wheat Ale",132,"Stevens Point Brewery","Stevens Point","WI","Point Nude Beach Summer Wheat (2011) (Stevens Point Brewery)" +"2009",2009,0.035,NA,684,"Drop Dead Blonde","American Blonde Ale",131,12,"American Blonde Ale",132,"Stevens Point Brewery","Stevens Point","WI","Drop Dead Blonde (Stevens Point Brewery)" +"2010",2010,0.049,13,650,"Three Kings Ale","Kölsch",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Three Kings Ale (Stevens Point Brewery)" +"2011",2011,0.057,15,456,"Point Oktoberfest","Märzen / Oktoberfest",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Oktoberfest (Stevens Point Brewery)" +"2012",2012,0.054,32,357,"2012 Black Ale","American Brown Ale",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","2012 Black Ale (Stevens Point Brewery)" +"2013",2013,0.05,7,141,"Point Nude Beach Summer Wheat (2010)","American Pale Wheat Ale",131,12,"American Pale Wheat Ale",132,"Stevens Point Brewery","Stevens Point","WI","Point Nude Beach Summer Wheat (2010) (Stevens Point Brewery)" +"2014",2014,0.054,33,140,"Point Cascade Pale Ale","American Pale Ale (APA)",131,12,"American Pale Ale (APA)",132,"Stevens Point Brewery","Stevens Point","WI","Point Cascade Pale Ale (Stevens Point Brewery)" +"2015",2015,0.047,14,139,"Point Amber Classic","American Amber / Red Lager",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Amber Classic (Stevens Point Brewery)" +"2016",2016,0.047,9,138,"Point Special Lager","American Adjunct Lager",131,12,NA,132,"Stevens Point Brewery","Stevens Point","WI","Point Special Lager (Stevens Point Brewery)" +"2017",2017,0.051,31,953,"Wisco Disco","American Amber / Red Ale",486,16,"American Amber / Red Ale",487,"Stillmank Beer Company","Green Bay","WI","Wisco Disco (Stillmank Beer Company)" +"2018",2018,0.05,NA,1983,"Brontide","American Black Ale",255,12,NA,256,"Stillwater Artisanal Ales","Baltimore","MD","Brontide (Stillwater Artisanal Ales)" +"2019",2019,0.05,NA,1631,"Brontide","American Black Ale",255,12,NA,256,"Stillwater Artisanal Ales","Baltimore","MD","Brontide (Stillwater Artisanal Ales)" +"2020",2020,0.045,NA,1344,"Classique","Saison / Farmhouse Ale",255,12,NA,256,"Stillwater Artisanal Ales","Baltimore","MD","Classique (Stillwater Artisanal Ales)" +"2021",2021,0.045,NA,922,"Sunsplash Golden Ale (2004)","American Blonde Ale",492,12,"American Blonde Ale",493,"Stone Coast Brewing Company","Portland","ME","Sunsplash Golden Ale (2004) (Stone Coast Brewing Company)" +"2022",2022,0.051,25,1410,"Sand Island Lighthouse","Kölsch",412,12,NA,413,"Straight to Ale","Huntsville","AL","Sand Island Lighthouse (Straight to Ale)" +"2023",2023,0.05,30,925,"Lily Flagg Milk Stout","Milk / Sweet Stout",412,12,NA,413,"Straight to Ale","Huntsville","AL","Lily Flagg Milk Stout (Straight to Ale)" +"2024",2024,0.072,70,637,"Monkeynaut IPA","American IPA",412,12,"American IPA",413,"Straight to Ale","Huntsville","AL","Monkeynaut IPA (Straight to Ale)" +"2025",2025,0.05,NA,2369,"Straub Beer (Current)","American Adjunct Lager",129,12,NA,130,"Straub Brewery","St Mary's","PA","Straub Beer (Current) (Straub Brewery)" +"2026",2026,0.0409999999999999,8,2233,"American Lager","American Adjunct Lager",129,12,NA,130,"Straub Brewery","St Mary's","PA","American Lager (Straub Brewery)" +"2027",2027,0.0409999999999999,8,2232,"American Amber","American Amber / Red Lager",129,12,NA,130,"Straub Brewery","St Mary's","PA","American Amber (Straub Brewery)" +"2028",2028,0.032,13,2231,"American Light","Light Lager",129,12,NA,130,"Straub Brewery","St Mary's","PA","American Light (Straub Brewery)" +"2029",2029,0.053,49,2352,"Extra Pale Ale","American Pale Ale (APA)",138,12,"American Pale Ale (APA)",139,"Summit Brewing Company","St Paul","MN","Extra Pale Ale (Summit Brewing Company)" +"2030",2030,0.053,40,2549,"Make It So","Extra Special / Strong Bitter (ESB)",58,12,NA,59,"Summit Brewing Company","St. Paul","MN","Make It So (Summit Brewing Company)" +"2031",2031,0.047,55,2473,"Hopvale Organic Ale","American Pale Ale (APA)",58,16,"American Pale Ale (APA)",59,"Summit Brewing Company","St. Paul","MN","Hopvale Organic Ale (Summit Brewing Company)" +"2032",2032,0.083,100,2415,"Unchained #18 Hop Silo","American Double / Imperial IPA",58,16,"American Double / Imperial IPA",59,"Summit Brewing Company","St. Paul","MN","Unchained #18 Hop Silo (Summit Brewing Company)" +"2033",2033,0.052,29,2605,"Tip Off","Altbier",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Tip Off (Sun King Brewing Company)" +"2034",2034,0.054,NA,2215,"Java Mac","Scottish Ale",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Java Mac (Sun King Brewing Company)" +"2035",2035,0.054,23,2164,"Cowbell","American Porter",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Cowbell (Sun King Brewing Company)" +"2036",2036,0.0579999999999999,20,2085,"Hop Up Offa That Brett (2014)","Belgian Pale Ale",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Hop Up Offa That Brett (2014) (Sun King Brewing Company)" +"2037",2037,0.083,23,2084,"PV Muckle (2013)","Scotch Ale / Wee Heavy",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","PV Muckle (2013) (Sun King Brewing Company)" +"2038",2038,0.099,36,2083,"Bourbon Barrel Batch 666: Sympathy for the Devil","Belgian Dark Ale",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Bourbon Barrel Batch 666: Sympathy for the Devil (Sun King Brewing Company)" +"2039",2039,0.09,30,2082,"Whip Fight","Scotch Ale / Wee Heavy",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Whip Fight (Sun King Brewing Company)" +"2040",2040,0.053,23,2081,"Port Barrel Wee Mac","Scotch Ale / Wee Heavy",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Port Barrel Wee Mac (Sun King Brewing Company)" +"2041",2041,0.064,75,2001,"Fistful Of Hops Red","American IPA",25,16,"American IPA",26,"Sun King Brewing Company","Indianapolis","IN","Fistful Of Hops Red (Sun King Brewing Company)" +"2042",2042,0.063,75,2000,"Fistful of Hops Orange","American IPA",25,16,"American IPA",26,"Sun King Brewing Company","Indianapolis","IN","Fistful of Hops Orange (Sun King Brewing Company)" +"2043",2043,0.064,75,1999,"Fistful Of Hops Blue","American IPA",25,16,"American IPA",26,"Sun King Brewing Company","Indianapolis","IN","Fistful Of Hops Blue (Sun King Brewing Company)" +"2044",2044,0.064,75,1996,"Fistful of Hops Green","American IPA",25,16,"American IPA",26,"Sun King Brewing Company","Indianapolis","IN","Fistful of Hops Green (Sun King Brewing Company)" +"2045",2045,NA,NA,1948,"30 Min Coma","Belgian IPA",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","30 Min Coma (Sun King Brewing Company)" +"2046",2046,0.09,30,1656,"Wee Muckle","Scotch Ale / Wee Heavy",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Wee Muckle (Sun King Brewing Company)" +"2047",2047,0.065,55,1599,"Royal Brat","Extra Special / Strong Bitter (ESB)",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Royal Brat (Sun King Brewing Company)" +"2048",2048,0.075,77,1420,"Grapefruit Jungle (GFJ)","American IPA",25,16,"American IPA",26,"Sun King Brewing Company","Indianapolis","IN","Grapefruit Jungle (GFJ) (Sun King Brewing Company)" +"2049",2049,0.0559999999999999,50,1389,"Osiris Pale Ale","American Pale Ale (APA)",25,16,"American Pale Ale (APA)",26,"Sun King Brewing Company","Indianapolis","IN","Osiris Pale Ale (Sun King Brewing Company)" +"2050",2050,0.099,75,1367,"Bourbon Barrel Aged Timmie","Russian Imperial Stout",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Bourbon Barrel Aged Timmie (Sun King Brewing Company)" +"2051",2051,0.063,23,1366,"Stupid Sexy Flanders","Flanders Oud Bruin",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Stupid Sexy Flanders (Sun King Brewing Company)" +"2052",2052,NA,NA,1347,"Bourbon Barrel Cowbell","American Porter",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Bourbon Barrel Cowbell (Sun King Brewing Company)" +"2053",2053,0.054,NA,1314,"Popcorn Pilsner","German Pilsener",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Popcorn Pilsner (Sun King Brewing Company)" +"2054",2054,0.071,27,1128,"Ring of Dingle","Irish Dry Stout",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Ring of Dingle (Sun King Brewing Company)" +"2055",2055,0.054,23,1127,"Bourbon Barrel Wee Mac","Scottish Ale",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Bourbon Barrel Wee Mac (Sun King Brewing Company)" +"2056",2056,0.099,60,1049,"Bourbon Barrel Johan","English Barleywine",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Bourbon Barrel Johan (Sun King Brewing Company)" +"2057",2057,0.07,NA,934,"The Deuce","American Brown Ale",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","The Deuce (Sun King Brewing Company)" +"2058",2058,0.09,24,923,"The Velvet Fog","Quadrupel (Quad)",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","The Velvet Fog (Sun King Brewing Company)" +"2059",2059,0.055,23,874,"Sun King Oktoberfest","Märzen / Oktoberfest",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Sun King Oktoberfest (Sun King Brewing Company)" +"2060",2060,0.052,24,739,"Indianapolis Indians Lager","Dortmunder / Export Lager",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Indianapolis Indians Lager (Sun King Brewing Company)" +"2061",2061,0.052,24,698,"Indians Victory Lager (2012)","Dortmunder / Export Lager",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Indians Victory Lager (2012) (Sun King Brewing Company)" +"2062",2062,0.08,NA,660,"Chaka","Belgian Strong Pale Ale",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Chaka (Sun King Brewing Company)" +"2063",2063,0.091,91,651,"Isis","American Double / Imperial IPA",25,16,"American Double / Imperial IPA",26,"Sun King Brewing Company","Indianapolis","IN","Isis (Sun King Brewing Company)" +"2064",2064,0.09,30,584,"Wee Muckle (2011)","Scotch Ale / Wee Heavy",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Wee Muckle (2011) (Sun King Brewing Company)" +"2065",2065,0.075,77,532,"Grapefruit Jungle (GFJ) (2011)","American IPA",25,16,"American IPA",26,"Sun King Brewing Company","Indianapolis","IN","Grapefruit Jungle (GFJ) (2011) (Sun King Brewing Company)" +"2066",2066,0.055,23,526,"Sun King Oktoberfest (2011)","Märzen / Oktoberfest",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Sun King Oktoberfest (2011) (Sun King Brewing Company)" +"2067",2067,0.099,60,394,"Johan the Barleywine","English Barleywine",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Johan the Barleywine (Sun King Brewing Company)" +"2068",2068,0.054,23,213,"Wee Mac Scottish-Style Ale","Scottish Ale",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Wee Mac Scottish-Style Ale (Sun King Brewing Company)" +"2069",2069,0.053,20,55,"Sunlight Cream Ale","Cream Ale",25,16,NA,26,"Sun King Brewing Company","Indianapolis","IN","Sunlight Cream Ale (Sun King Brewing Company)" +"2070",2070,0.0559999999999999,50,54,"Osiris Pale Ale (2010)","American Pale Ale (APA)",25,16,"American Pale Ale (APA)",26,"Sun King Brewing Company","Indianapolis","IN","Osiris Pale Ale (2010) (Sun King Brewing Company)" +"2071",2071,0.045,NA,1207,"Dam Lager","American Amber / Red Lager",455,12,NA,456,"Sunken City Brewing Company","Hardy","VA","Dam Lager (Sunken City Brewing Company)" +"2072",2072,0.07,NA,1206,"Red Clay IPA","American IPA",455,12,"American IPA",456,"Sunken City Brewing Company","Hardy","VA","Red Clay IPA (Sunken City Brewing Company)" +"2073",2073,0.072,NA,2543,"Todd the Axe Man","American IPA",61,16,"American IPA",62,"Surly Brewing Company","Brooklyn Center","MN","Todd the Axe Man (Surly Brewing Company)" +"2074",2074,0.057,NA,2409,"Doomtree","Extra Special / Strong Bitter (ESB)",61,16,NA,62,"Surly Brewing Company","Brooklyn Center","MN","Doomtree (Surly Brewing Company)" +"2075",2075,0.099,85,1739,"BLAKKR","American Black Ale",61,16,NA,62,"Surly Brewing Company","Brooklyn Center","MN","BLAKKR (Surly Brewing Company)" +"2076",2076,0.073,69,1112,"Overrated! West Coast Style IPA","American IPA",61,16,"American IPA",62,"Surly Brewing Company","Brooklyn Center","MN","Overrated! West Coast Style IPA (Surly Brewing Company)" +"2077",2077,0.075,90,329,"WET","American IPA",61,16,"American IPA",62,"Surly Brewing Company","Brooklyn Center","MN","WET (Surly Brewing Company)" +"2078",2078,0.04,37,19,"Bitter Brewer","English Bitter",61,16,NA,62,"Surly Brewing Company","Brooklyn Center","MN","Bitter Brewer (Surly Brewing Company)" +"2079",2079,0.055,34,18,"SurlyFest","Rye Beer",61,16,NA,62,"Surly Brewing Company","Brooklyn Center","MN","SurlyFest (Surly Brewing Company)" +"2080",2080,0.051,45,17,"Coffee Bender","American Brown Ale",61,16,NA,62,"Surly Brewing Company","Brooklyn Center","MN","Coffee Bender (Surly Brewing Company)" +"2081",2081,0.051,45,16,"Bender","American Brown Ale",61,16,NA,62,"Surly Brewing Company","Brooklyn Center","MN","Bender (Surly Brewing Company)" +"2082",2082,0.0969999999999999,120,15,"Abrasive Ale","American Double / Imperial IPA",61,16,"American Double / Imperial IPA",62,"Surly Brewing Company","Brooklyn Center","MN","Abrasive Ale (Surly Brewing Company)" +"2083",2083,0.051,20,14,"Hell","Keller Bier / Zwickel Bier",61,16,NA,62,"Surly Brewing Company","Brooklyn Center","MN","Hell (Surly Brewing Company)" +"2084",2084,0.067,33,13,"CynicAle","Saison / Farmhouse Ale",61,16,NA,62,"Surly Brewing Company","Brooklyn Center","MN","CynicAle (Surly Brewing Company)" +"2085",2085,0.062,99,12,"Furious","American IPA",61,16,"American IPA",62,"Surly Brewing Company","Brooklyn Center","MN","Furious (Surly Brewing Company)" +"2086",2086,0.073,50,1242,"Big Nose","American IPA",447,12,"American IPA",448,"Swamp Head Brewery","Gainesville","FL","Big Nose (Swamp Head Brewery)" +"2087",2087,0.05,10,1241,"Cotton Mouth","Witbier",447,12,NA,448,"Swamp Head Brewery","Gainesville","FL","Cotton Mouth (Swamp Head Brewery)" +"2088",2088,0.0559999999999999,35,1240,"Stump Knocker Pale Ale","American Pale Ale (APA)",447,12,"American Pale Ale (APA)",448,"Swamp Head Brewery","Gainesville","FL","Stump Knocker Pale Ale (Swamp Head Brewery)" +"2089",2089,0.05,38,1239,"Midnight Oil","Oatmeal Stout",447,12,NA,448,"Swamp Head Brewery","Gainesville","FL","Midnight Oil (Swamp Head Brewery)" +"2090",2090,0.059,18,1238,"Wild Night","Cream Ale",447,12,NA,448,"Swamp Head Brewery","Gainesville","FL","Wild Night (Swamp Head Brewery)" +"2091",2091,0.045,NA,1554,"Bermuda Triangle Ginger Beer","Herbed / Spiced Beer",381,12,NA,382,"Swashbuckler Brewing Company","Manheim","PA","Bermuda Triangle Ginger Beer (Swashbuckler Brewing Company)" +"2092",2092,0.055,35,2568,"Take Two Pils","German Pilsener",49,12,NA,50,"SweetWater Brewing Company","Atlanta","GA","Take Two Pils (SweetWater Brewing Company)" +"2093",2093,0.057,NA,2551,"Waterkeeper","Hefeweizen",49,12,NA,50,"SweetWater Brewing Company","Atlanta","GA","Waterkeeper (SweetWater Brewing Company)" +"2094",2094,0.064,NA,1710,"SweetWater IPA","American IPA",49,12,"American IPA",50,"SweetWater Brewing Company","Atlanta","GA","SweetWater IPA (SweetWater Brewing Company)" +"2095",2095,0.054,NA,1709,"420 Extra Pale Ale","American Pale Ale (APA)",49,12,"American Pale Ale (APA)",50,"SweetWater Brewing Company","Atlanta","GA","420 Extra Pale Ale (SweetWater Brewing Company)" +"2096",2096,0.08,95,1229,"Dodgy Knight Imperial IPA","American Double / Imperial IPA",449,12,"American Double / Imperial IPA",450,"TailGate Beer","San Diego","CA","Dodgy Knight Imperial IPA (TailGate Beer)" +"2097",2097,0.05,NA,1164,"TailGate Saison","Saison / Farmhouse Ale",449,12,NA,450,"TailGate Beer","San Diego","CA","TailGate Saison (TailGate Beer)" +"2098",2098,0.05,44,663,"TailGate IPA","American IPA",449,24,"American IPA",450,"TailGate Beer","San Diego","CA","TailGate IPA (TailGate Beer)" +"2099",2099,0.05,44,662,"TailGate IPA","American IPA",449,12,"American IPA",450,"TailGate Beer","San Diego","CA","TailGate IPA (TailGate Beer)" +"2100",2100,0.049,28,623,"TailGate Hefeweizen","Hefeweizen",449,24,NA,450,"TailGate Beer","San Diego","CA","TailGate Hefeweizen (TailGate Beer)" +"2101",2101,0.05,19,622,"Blacktop Blonde","American Blonde Ale",449,24,"American Blonde Ale",450,"TailGate Beer","San Diego","CA","Blacktop Blonde (TailGate Beer)" +"2102",2102,0.05,19,362,"Blacktop Blonde","American Blonde Ale",449,12,"American Blonde Ale",450,"TailGate Beer","San Diego","CA","Blacktop Blonde (TailGate Beer)" +"2103",2103,0.049,28,361,"TailGate Hefeweizen","Hefeweizen",449,12,NA,450,"TailGate Beer","San Diego","CA","TailGate Hefeweizen (TailGate Beer)" +"2104",2104,0.085,34,2575,"Wooden Rooster","Tripel",45,16.9,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Wooden Rooster (Tallgrass Brewing Company)" +"2105",2105,0.048,20,2555,"Ginger Peach Saison","Saison / Farmhouse Ale",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Ginger Peach Saison (Tallgrass Brewing Company)" +"2106",2106,0.062,35,1736,"Zombie Monkie","American Porter",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Zombie Monkie (Tallgrass Brewing Company)" +"2107",2107,0.0559999999999999,20,1196,"Wild Plum Farmhouse Ale","Saison / Farmhouse Ale",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Wild Plum Farmhouse Ale (Tallgrass Brewing Company)" +"2108",2108,0.05,20,1063,"Vanilla Bean Buffalo Sweat","Oatmeal Stout",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Vanilla Bean Buffalo Sweat (Tallgrass Brewing Company)" +"2109",2109,0.068,110,1017,"Ethos IPA","American IPA",45,16,"American IPA",46,"Tallgrass Brewing Company","Manhattan","KS","Ethos IPA (Tallgrass Brewing Company)" +"2110",2110,0.044,12,1009,"Tallgrass Pub Ale","American Brown Ale",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Tallgrass Pub Ale (Tallgrass Brewing Company)" +"2111",2111,0.072,93,912,"Oasis","Extra Special / Strong Bitter (ESB)",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Oasis (Tallgrass Brewing Company)" +"2112",2112,0.05,20,765,"Buffalo Sweat","Milk / Sweet Stout",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Buffalo Sweat (Tallgrass Brewing Company)" +"2113",2113,0.05,20,676,"Halcyon Unfiltered Wheat","American Pale Wheat Ale",45,16,"American Pale Wheat Ale",46,"Tallgrass Brewing Company","Manhattan","KS","Halcyon Unfiltered Wheat (Tallgrass Brewing Company)" +"2114",2114,0.052,NA,595,"8-Bit Pale Ale","American Pale Ale (APA)",45,16,"American Pale Ale (APA)",46,"Tallgrass Brewing Company","Manhattan","KS","8-Bit Pale Ale (Tallgrass Brewing Company)" +"2115",2115,0.085,NA,537,"Velvet Rooster","Tripel",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Velvet Rooster (Tallgrass Brewing Company)" +"2116",2116,0.05,20,412,"Halcyon Unfiltered Wheat","American Pale Wheat Ale",45,12,"American Pale Wheat Ale",46,"Tallgrass Brewing Company","Manhattan","KS","Halcyon Unfiltered Wheat (Tallgrass Brewing Company)" +"2117",2117,0.05,16,105,"Köld Lager (2010)","German Pilsener",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Köld Lager (2010) (Tallgrass Brewing Company)" +"2118",2118,0.072,93,104,"Oasis (2010)","American Double / Imperial IPA",45,16,"American Double / Imperial IPA",46,"Tallgrass Brewing Company","Manhattan","KS","Oasis (2010) (Tallgrass Brewing Company)" +"2119",2119,0.044,22,103,"Tallgrass Ale","American Brown Ale",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Tallgrass Ale (Tallgrass Brewing Company)" +"2120",2120,0.05,20,102,"Buffalo Sweat (2010)","Milk / Sweet Stout",45,16,NA,46,"Tallgrass Brewing Company","Manhattan","KS","Buffalo Sweat (2010) (Tallgrass Brewing Company)" +"2121",2121,0.063,60,101,"Tallgrass IPA","American IPA",45,16,"American IPA",46,"Tallgrass Brewing Company","Manhattan","KS","Tallgrass IPA (Tallgrass Brewing Company)" +"2122",2122,0.068,NA,1433,"Hat Trick Hop IPA","American IPA",409,16,"American IPA",410,"Tamarack Brewing Company","Lakeside","MT","Hat Trick Hop IPA (Tamarack Brewing Company)" +"2123",2123,0.0559999999999999,NA,1432,"Yard Sale Amber Ale","American Amber / Red Ale",409,16,"American Amber / Red Ale",410,"Tamarack Brewing Company","Lakeside","MT","Yard Sale Amber Ale (Tamarack Brewing Company)" +"2124",2124,0.055,NA,936,"Loafin Bräu","Altbier",490,16,NA,491,"Tampa Bay Brewing Company","Tampa","FL","Loafin Bräu (Tampa Bay Brewing Company)" +"2125",2125,0.07,80,544,"Old Elephant Foot IPA","American IPA",490,16,"American IPA",491,"Tampa Bay Brewing Company","Tampa","FL","Old Elephant Foot IPA (Tampa Bay Brewing Company)" +"2126",2126,0.065,35,2640,"Peck's Porter","American Porter",7,16,NA,8,"Tapistry Brewing","Bridgman","MI","Peck's Porter (Tapistry Brewing)" +"2127",2127,0.07,NA,2448,"Reactor","American IPA",7,16,"American IPA",8,"Tapistry Brewing","Bridgman","MI","Reactor (Tapistry Brewing)" +"2128",2128,0.057,NA,2447,"Mr. Orange","Witbier",7,16,NA,8,"Tapistry Brewing","Bridgman","MI","Mr. Orange (Tapistry Brewing)" +"2129",2129,0.08,22,2601,"Deduction","Dubbel",28,12,NA,29,"Taxman Brewing Company","Bargersville","IN","Deduction (Taxman Brewing Company)" +"2130",2130,0.057,NA,973,"Face Down Brown Ale","American Brown Ale",480,12,NA,481,"Telluride Brewing Company","Telluride","CO","Face Down Brown Ale (Telluride Brewing Company)" +"2131",2131,0.064,NA,827,"Tempter IPA","American IPA",480,12,"American IPA",481,"Telluride Brewing Company","Telluride","CO","Tempter IPA (Telluride Brewing Company)" +"2132",2132,0.055,NA,589,"Bridal Veil Rye Pale Ale","American Pale Ale (APA)",480,12,"American Pale Ale (APA)",481,"Telluride Brewing Company","Telluride","CO","Bridal Veil Rye Pale Ale (Telluride Brewing Company)" +"2133",2133,0.048,NA,2155,"Smittytown","Extra Special / Strong Bitter (ESB)",210,12,NA,211,"Temperance Beer Company","Evanston","IL","Smittytown (Temperance Beer Company)" +"2134",2134,0.04,NA,1982,"Greenwood Beach","Fruit / Vegetable Beer",210,12,NA,211,"Temperance Beer Company","Evanston","IL","Greenwood Beach (Temperance Beer Company)" +"2135",2135,0.066,NA,1939,"Gatecrasher","English India Pale Ale (IPA)",210,12,NA,211,"Temperance Beer Company","Evanston","IL","Gatecrasher (Temperance Beer Company)" +"2136",2136,0.047,42,1082,"RecreationAle","American Pale Ale (APA)",469,12,"American Pale Ale (APA)",470,"Terrapin Brewing Company","Athens","GA","RecreationAle (Terrapin Brewing Company)" +"2137",2137,0.055,35,2119,"First Stand","Saison / Farmhouse Ale",215,12,NA,216,"Texian Brewing Co.","Richmond","TX","First Stand (Texian Brewing Co.)" +"2138",2138,0.063,23,2118,"Battle LIne","American Brown Ale",215,12,NA,216,"Texian Brewing Co.","Richmond","TX","Battle LIne (Texian Brewing Co.)" +"2139",2139,0.0559999999999999,12,2117,"Broken Bridge","Dunkelweizen",215,12,NA,216,"Texian Brewing Co.","Richmond","TX","Broken Bridge (Texian Brewing Co.)" +"2140",2140,0.071,69,2116,"Brutus","English India Pale Ale (IPA)",215,12,NA,216,"Texian Brewing Co.","Richmond","TX","Brutus (Texian Brewing Co.)" +"2141",2141,0.06,NA,1916,"Petit Mutant","American Wild Ale",272,16,NA,273,"The Alchemist","Waterbury","VT","Petit Mutant (The Alchemist)" +"2142",2142,0.096,NA,1915,"The Crusher","American Double / Imperial IPA",272,16,"American Double / Imperial IPA",273,"The Alchemist","Waterbury","VT","The Crusher (The Alchemist)" +"2143",2143,0.08,NA,1914,"Beelzebub","American Double / Imperial Stout",272,16,NA,273,"The Alchemist","Waterbury","VT","Beelzebub (The Alchemist)" +"2144",2144,0.07,NA,1810,"Focal Banger","American IPA",272,16,"American IPA",273,"The Alchemist","Waterbury","VT","Focal Banger (The Alchemist)" +"2145",2145,0.08,120,1111,"Heady Topper","American Double / Imperial IPA",272,16,"American Double / Imperial IPA",273,"The Alchemist","Waterbury","VT","Heady Topper (The Alchemist)" +"2146",2146,0.08,120,379,"Heady Topper","American Double / Imperial IPA",272,16,"American Double / Imperial IPA",273,"The Alchemist","Waterbury","VT","Heady Topper (The Alchemist)" +"2147",2147,0.046,20,1200,"Bomber Mountain Amber Ale (2013)","American Amber / Red Ale",457,12,"American Amber / Red Ale",458,"The Black Tooth Brewing Company","Sheridan","WY","Bomber Mountain Amber Ale (2013) (The Black Tooth Brewing Company)" +"2148",2148,0.07,75,1199,"Indian Paintbrush IPA","American IPA",457,12,"American IPA",458,"The Black Tooth Brewing Company","Sheridan","WY","Indian Paintbrush IPA (The Black Tooth Brewing Company)" +"2149",2149,0.048,16,1198,"Saddle Bronc Brown Ale (2013)","English Brown Ale",457,12,NA,458,"The Black Tooth Brewing Company","Sheridan","WY","Saddle Bronc Brown Ale (2013) (The Black Tooth Brewing Company)" +"2150",2150,0.059,15,1197,"Wagon Box Wheat Beer","American Pale Wheat Ale",457,12,"American Pale Wheat Ale",458,"The Black Tooth Brewing Company","Sheridan","WY","Wagon Box Wheat Beer (The Black Tooth Brewing Company)" +"2151",2151,0.05,NA,1945,"Birdhouse Pale Ale","Belgian Pale Ale",262,12,NA,263,"The Brewer's Art","Baltimore","MD","Birdhouse Pale Ale (The Brewer's Art)" +"2152",2152,0.073,NA,1079,"Ozzy","Belgian Pale Ale",262,12,NA,263,"The Brewer's Art","Baltimore","MD","Ozzy (The Brewer's Art)" +"2153",2153,0.07,NA,94,"Resurrection","Dubbel",262,12,NA,263,"The Brewer's Art","Baltimore","MD","Resurrection (The Brewer's Art)" +"2154",2154,0.052,16,1748,"Bronx Summer Pale Ale","American Pale Ale (APA)",329,16,"American Pale Ale (APA)",330,"The Bronx Brewery","Bronx","NY","Bronx Summer Pale Ale (The Bronx Brewery)" +"2155",2155,0.057,46,1747,"Bronx Black Pale Ale","American Black Ale",329,16,NA,330,"The Bronx Brewery","Bronx","NY","Bronx Black Pale Ale (The Bronx Brewery)" +"2156",2156,0.063,50,1037,"Bronx Pale Ale","American Pale Ale (APA)",329,16,"American Pale Ale (APA)",330,"The Bronx Brewery","Bronx","NY","Bronx Pale Ale (The Bronx Brewery)" +"2157",2157,0.052,35,2594,"Surfrider","American Pale Ale (APA)",33,16,"American Pale Ale (APA)",34,"The Dudes' Brewing Company","Torrance","CA","Surfrider (The Dudes' Brewing Company)" +"2158",2158,0.055,NA,2035,"Kolschtal Eddy","Kölsch",33,16,NA,34,"The Dudes' Brewing Company","Torrance","CA","Kolschtal Eddy (The Dudes' Brewing Company)" +"2159",2159,0.05,NA,2034,"South Bay Session IPA","American IPA",33,16,"American IPA",34,"The Dudes' Brewing Company","Torrance","CA","South Bay Session IPA (The Dudes' Brewing Company)" +"2160",2160,0.069,34,1562,"Grandma's Pecan","English Brown Ale",33,16,NA,34,"The Dudes' Brewing Company","Torrance","CA","Grandma's Pecan (The Dudes' Brewing Company)" +"2161",2161,0.099,101,1561,"Double Trunk","American Double / Imperial IPA",33,16,"American Double / Imperial IPA",34,"The Dudes' Brewing Company","Torrance","CA","Double Trunk (The Dudes' Brewing Company)" +"2162",2162,0.046,45,1749,"Just IPA","American IPA",328,12,"American IPA",329,"The Just Beer Project","Burlington","VT","Just IPA (The Just Beer Project)" +"2163",2163,0.045,NA,2455,"Lionshead","American Pilsner",90,12,NA,91,"The Lion Brewery","Wilkes-Barre","PA","Lionshead (The Lion Brewery)" +"2164",2164,NA,NA,963,"Manhattan Gold Lager (1990)","American Amber / Red Lager",484,12,NA,485,"The Manhattan Brewing Company","New York","NY","Manhattan Gold Lager (1990) (The Manhattan Brewing Company)" +"2165",2165,0.052,NA,2638,"G. B. Russo’s Italian Pistachio Pale Ale","American Pale Ale (APA)",9,16,"American Pale Ale (APA)",10,"The Mitten Brewing Company","Grand Rapids","MI","G. B. Russo’s Italian Pistachio Pale Ale (The Mitten Brewing Company)" +"2166",2166,0.0579999999999999,NA,1278,"Northern Hawk Owl Amber","American Amber / Red Ale",438,12,"American Amber / Red Ale",439,"The Right Brain Brewery","Traverse City","MI","Northern Hawk Owl Amber (The Right Brain Brewery)" +"2167",2167,0.059,NA,1277,"CEO Stout","American Stout",438,16,NA,439,"The Right Brain Brewery","Traverse City","MI","CEO Stout (The Right Brain Brewery)" +"2168",2168,0.047,NA,1276,"Will Power Pale Ale","American Pale Ale (APA)",438,16,"American Pale Ale (APA)",439,"The Right Brain Brewery","Traverse City","MI","Will Power Pale Ale (The Right Brain Brewery)" +"2169",2169,0.044,NA,1732,"Curious Traveler Shandy","Shandy",334,12,NA,335,"The Traveler Beer Company","Burlington","VT","Curious Traveler Shandy (The Traveler Beer Company)" +"2170",2170,0.048,18,2347,"Hunny Do Wheat","American Pale Wheat Ale",142,12,"American Pale Wheat Ale",143,"Third Street Brewhouse","Cold Spring","MN","Hunny Do Wheat (Third Street Brewhouse)" +"2171",2171,0.052,NA,1781,"Three Way Pale Ale","American Pale Ale (APA)",142,12,"American Pale Ale (APA)",143,"Third Street Brewhouse","Cold Spring","MN","Three Way Pale Ale (Third Street Brewhouse)" +"2172",2172,0.0409999999999999,NA,1780,"Rise to the Top","Cream Ale",142,12,NA,143,"Third Street Brewhouse","Cold Spring","MN","Rise to the Top (Third Street Brewhouse)" +"2173",2173,0.049,NA,1779,"Lost Trout Brown Ale","American Brown Ale",142,12,NA,143,"Third Street Brewhouse","Cold Spring","MN","Lost Trout Brown Ale (Third Street Brewhouse)" +"2174",2174,0.051,11,2421,"Watermelon Ale","Fruit / Vegetable Beer",108,12,NA,109,"Thomas Hooker Brewing Company","Bloomfield","CT","Watermelon Ale (Thomas Hooker Brewing Company)" +"2175",2175,0.04,18,2319,"Knotty Blonde Ale","American Blonde Ale",153,12,"American Blonde Ale",154,"Three Creeks Brewing","Sisters","OR","Knotty Blonde Ale (Three Creeks Brewing)" +"2176",2176,0.062,40,2317,"Fivepine Chocolate Porter","American Porter",153,12,NA,154,"Three Creeks Brewing","Sisters","OR","Fivepine Chocolate Porter (Three Creeks Brewing)" +"2177",2177,0.062,82,2316,"Hoodoo Voodoo IPA","American IPA",153,12,"American IPA",154,"Three Creeks Brewing","Sisters","OR","Hoodoo Voodoo IPA (Three Creeks Brewing)" +"2178",2178,0.053,22,1913,"Hydraulion Red","Irish Red Ale",273,12,NA,274,"Three Notch'd Brewing Company","Charlottesville","VA","Hydraulion Red (Three Notch'd Brewing Company)" +"2179",2179,0.06,50,1912,"40 Mile IPA","American IPA",273,12,"American IPA",274,"Three Notch'd Brewing Company","Charlottesville","VA","40 Mile IPA (Three Notch'd Brewing Company)" +"2180",2180,0.055,64,2617,"Citra Faced","American Pale Wheat Ale",21,16,"American Pale Wheat Ale",22,"Three Pints Brewing","Martinsville","IN","Citra Faced (Three Pints Brewing)" +"2181",2181,0.055,31,2616,"Pole Barn Stout","Oatmeal Stout",21,16,NA,22,"Three Pints Brewing","Martinsville","IN","Pole Barn Stout (Three Pints Brewing)" +"2182",2182,0.054,37,2615,"Pale","American Pale Ale (APA)",21,16,"American Pale Ale (APA)",22,"Three Pints Brewing","Martinsville","IN","Pale (Three Pints Brewing)" +"2183",2183,0.053,27,2614,"Yoshi's Nectar","California Common / Steam Beer",21,16,NA,22,"Three Pints Brewing","Martinsville","IN","Yoshi's Nectar (Three Pints Brewing)" +"2184",2184,0.052,NA,1889,"Leatherhead Red","American Amber / Red Ale",282,12,"American Amber / Red Ale",283,"Thunderhead Brewing Company","Kearney","NE","Leatherhead Red (Thunderhead Brewing Company)" +"2185",2185,0.065,NA,1222,"Cropduster Mid-American IPA","American IPA",282,12,"American IPA",283,"Thunderhead Brewing Company","Kearney","NE","Cropduster Mid-American IPA (Thunderhead Brewing Company)" +"2186",2186,0.075,NA,122,"Golden Frau Honey Wheat","Braggot",282,12,NA,283,"Thunderhead Brewing Company","Kearney","NE","Golden Frau Honey Wheat (Thunderhead Brewing Company)" +"2187",2187,NA,NA,121,"Cornstalker Dark Wheat","American Dark Wheat Ale",282,12,NA,283,"Thunderhead Brewing Company","Kearney","NE","Cornstalker Dark Wheat (Thunderhead Brewing Company)" +"2188",2188,0.0579999999999999,20,2623,"Cafe Leche","American Porter",17,16,NA,18,"Tin Man Brewing Company","Evansville","IN","Cafe Leche (Tin Man Brewing Company)" +"2189",2189,0.052,12,2622,"Damascene Apricot Sour","Fruit / Vegetable Beer",17,16,NA,18,"Tin Man Brewing Company","Evansville","IN","Damascene Apricot Sour (Tin Man Brewing Company)" +"2190",2190,0.12,90,2621,"Csar","Russian Imperial Stout",17,16,NA,18,"Tin Man Brewing Company","Evansville","IN","Csar (Tin Man Brewing Company)" +"2191",2191,0.055,NA,1817,"Klingon Warnog Roggen Dunkel","Roggenbier",17,16,NA,18,"Tin Man Brewing Company","Evansville","IN","Klingon Warnog Roggen Dunkel (Tin Man Brewing Company)" +"2192",2192,0.085,115,1449,"Overlord Imperial IPA","American Double / Imperial IPA",17,16,"American Double / Imperial IPA",18,"Tin Man Brewing Company","Evansville","IN","Overlord Imperial IPA (Tin Man Brewing Company)" +"2193",2193,0.0579999999999999,36,951,"Alloy","American IPA",17,16,"American IPA",18,"Tin Man Brewing Company","Evansville","IN","Alloy (Tin Man Brewing Company)" +"2194",2194,0.051,22,950,"Rivet Irish Red Ale","Irish Red Ale",17,16,NA,18,"Tin Man Brewing Company","Evansville","IN","Rivet Irish Red Ale (Tin Man Brewing Company)" +"2195",2195,0.052,50,949,"3 Gear Robust Porter","American Porter",17,16,NA,18,"Tin Man Brewing Company","Evansville","IN","3 Gear Robust Porter (Tin Man Brewing Company)" +"2196",2196,0.045,35,948,"Circuit Bohemian Pilsner","Czech Pilsener",17,16,NA,18,"Tin Man Brewing Company","Evansville","IN","Circuit Bohemian Pilsner (Tin Man Brewing Company)" +"2197",2197,0.055,NA,2321,"Turnrow Harvest Ale","American Blonde Ale",152,12,"American Blonde Ale",153,"Tin Roof Brewing Company","Baton Rouge","LA","Turnrow Harvest Ale (Tin Roof Brewing Company)" +"2198",2198,0.07,60,1755,"Juke Joint IPA","American IPA",152,12,"American IPA",153,"Tin Roof Brewing Company","Baton Rouge","LA","Juke Joint IPA (Tin Roof Brewing Company)" +"2199",2199,0.07,35,1754,"Parade Ground Coffee Porter","American Porter",152,12,NA,153,"Tin Roof Brewing Company","Baton Rouge","LA","Parade Ground Coffee Porter (Tin Roof Brewing Company)" +"2200",2200,0.05,21,1428,"Tin Roof Watermelon Wheat","Fruit / Vegetable Beer",152,12,NA,153,"Tin Roof Brewing Company","Baton Rouge","LA","Tin Roof Watermelon Wheat (Tin Roof Brewing Company)" +"2201",2201,0.045,18,529,"Tin Roof Blonde Ale","American Blonde Ale",152,12,"American Blonde Ale",153,"Tin Roof Brewing Company","Baton Rouge","LA","Tin Roof Blonde Ale (Tin Roof Brewing Company)" +"2202",2202,0.055,37,495,"Voodoo Bengal Pale Ale","American Pale Ale (APA)",152,12,"American Pale Ale (APA)",153,"Tin Roof Brewing Company","Baton Rouge","LA","Voodoo Bengal Pale Ale (Tin Roof Brewing Company)" +"2203",2203,0.045,28,494,"Perfect Tin Amber","American Amber / Red Ale",152,12,"American Amber / Red Ale",153,"Tin Roof Brewing Company","Baton Rouge","LA","Perfect Tin Amber (Tin Roof Brewing Company)" +"2204",2204,0.073,87,1856,"IPA & a Half","American IPA",291,12,"American IPA",292,"Tommyknocker Brewery","Idaho Springs","CO","IPA & a Half (Tommyknocker Brewery)" +"2205",2205,0.055,33,736,"Ornery Amber Lager (2003)","Vienna Lager",291,12,NA,292,"Tommyknocker Brewery","Idaho Springs","CO","Ornery Amber Lager (2003) (Tommyknocker Brewery)" +"2206",2206,0.05,NA,1027,"Big Island Shandy","Shandy",474,16,NA,475,"Tonka Beer Company","Minnetonka","MN","Big Island Shandy (Tonka Beer Company)" +"2207",2207,0.068,NA,1026,"Preservation IPA","American IPA",474,16,"American IPA",475,"Tonka Beer Company","Minnetonka","MN","Preservation IPA (Tonka Beer Company)" +"2208",2208,0.062,72,1938,"Almanac IPA","American IPA",265,12,"American IPA",266,"Tractor Brewing Company","Albuquerque","NM","Almanac IPA (Tractor Brewing Company)" +"2209",2209,0.065,NA,1937,"Milk Mustachio Stout","Milk / Sweet Stout",265,12,NA,266,"Tractor Brewing Company","Albuquerque","NM","Milk Mustachio Stout (Tractor Brewing Company)" +"2210",2210,0.06,30,1936,"Farmer's Tan Red Ale","American Amber / Red Ale",265,12,"American Amber / Red Ale",266,"Tractor Brewing Company","Albuquerque","NM","Farmer's Tan Red Ale (Tractor Brewing Company)" +"2211",2211,0.057,NA,594,"Triangle India Pale Ale","American IPA",524,12,"American IPA",525,"Triangle Brewing Company","Durham","NC","Triangle India Pale Ale (Triangle Brewing Company)" +"2212",2212,0.05,NA,114,"Triangle White Ale","Witbier",524,12,NA,525,"Triangle Brewing Company","Durham","NC","Triangle White Ale (Triangle Brewing Company)" +"2213",2213,0.08,NA,113,"Triangle Belgian Golden Ale","Belgian Strong Pale Ale",524,12,NA,525,"Triangle Brewing Company","Durham","NC","Triangle Belgian Golden Ale (Triangle Brewing Company)" +"2214",2214,0.0819999999999999,NA,2445,"Troegenator","Doppelbock",97,16,NA,98,"Tröegs Brewing Company","Hershey","PA","Troegenator (Tröegs Brewing Company)" +"2215",2215,0.075,93,2444,"Nugget Nectar","American Amber / Red Ale",97,16,"American Amber / Red Ale",98,"Tröegs Brewing Company","Hershey","PA","Nugget Nectar (Tröegs Brewing Company)" +"2216",2216,0.045,45,2203,"Sunshine Pils","American Pilsner",97,12,NA,98,"Tröegs Brewing Company","Hershey","PA","Sunshine Pils (Tröegs Brewing Company)" +"2217",2217,0.0819999999999999,25,1510,"Troegenator Doublebock","Doppelbock",97,16,NA,98,"Tröegs Brewing Company","Hershey","PA","Troegenator Doublebock (Tröegs Brewing Company)" +"2218",2218,0.075,85,1509,"Perpetual IPA","American IPA",97,12,"American IPA",98,"Tröegs Brewing Company","Hershey","PA","Perpetual IPA (Tröegs Brewing Company)" +"2219",2219,0.055,52,433,"Greenville Pale Ale","American Pale Ale (APA)",539,12,"American Pale Ale (APA)",540,"Twin Lakes Brewing Company","Greenville","DE","Greenville Pale Ale (Twin Lakes Brewing Company)" +"2220",2220,0.062,65,641,"Hoppy Boy","American IPA",520,16,"American IPA",521,"Twisted Pine Brewing Company","Boulder","CO","Hoppy Boy (Twisted Pine Brewing Company)" +"2221",2221,0.054,26,2588,"Cow Creek","American Amber / Red Lager",38,12,NA,39,"Twisted X Brewing Company","Dripping Springs","TX","Cow Creek (Twisted X Brewing Company)" +"2222",2222,0.075,63,2458,"Chupahopra","American IPA",38,12,"American IPA",39,"Twisted X Brewing Company","Dripping Springs","TX","Chupahopra (Twisted X Brewing Company)" +"2223",2223,0.051,19,2212,"Twisted X","American Adjunct Lager",38,12,NA,39,"Twisted X Brewing Company","Dripping Springs","TX","Twisted X (Twisted X Brewing Company)" +"2224",2224,0.0409999999999999,41,2235,"Day Hike Session","American IPA",190,12,"American IPA",191,"Two Beers Brewing Company","Seattle","WA","Day Hike Session (Two Beers Brewing Company)" +"2225",2225,0.048,48,1661,"Trailhead ISA","American IPA",190,12,"American IPA",191,"Two Beers Brewing Company","Seattle","WA","Trailhead ISA (Two Beers Brewing Company)" +"2226",2226,0.052,27,1660,"Immersion Amber","American Amber / Red Ale",190,12,"American Amber / Red Ale",191,"Two Beers Brewing Company","Seattle","WA","Immersion Amber (Two Beers Brewing Company)" +"2227",2227,0.062,70,1659,"Evo IPA","American IPA",190,12,"American IPA",191,"Two Beers Brewing Company","Seattle","WA","Evo IPA (Two Beers Brewing Company)" +"2228",2228,0.048,NA,1438,"Presidential Pils","Czech Pilsener",190,12,NA,191,"Two Beers Brewing Company","Seattle","WA","Presidential Pils (Two Beers Brewing Company)" +"2229",2229,0.062,70,1173,"Evolutionary IPA (2012)","American IPA",190,12,"American IPA",191,"Two Beers Brewing Company","Seattle","WA","Evolutionary IPA (2012) (Two Beers Brewing Company)" +"2230",2230,0.057,36,560,"Persnickety Pale","American Pale Ale (APA)",190,12,"American Pale Ale (APA)",191,"Two Beers Brewing Company","Seattle","WA","Persnickety Pale (Two Beers Brewing Company)" +"2231",2231,0.054,20,519,"SoDo Brown Ale","American Brown Ale",190,12,NA,191,"Two Beers Brewing Company","Seattle","WA","SoDo Brown Ale (Two Beers Brewing Company)" +"2232",2232,0.052,27,518,"Immersion Amber Ale (2011)","American Amber / Red Ale",190,12,"American Amber / Red Ale",191,"Two Beers Brewing Company","Seattle","WA","Immersion Amber Ale (2011) (Two Beers Brewing Company)" +"2233",2233,0.062,70,505,"Evolutionary IPA (2011)","American IPA",190,12,"American IPA",191,"Two Beers Brewing Company","Seattle","WA","Evolutionary IPA (2011) (Two Beers Brewing Company)" +"2234",2234,0.048,48,482,"Trailhead India Style Session Ale (2011)","American IPA",190,12,"American IPA",191,"Two Beers Brewing Company","Seattle","WA","Trailhead India Style Session Ale (2011) (Two Beers Brewing Company)" +"2235",2235,0.046,NA,451,"Panorama Wheat Ale","American Pale Wheat Ale",190,12,"American Pale Wheat Ale",191,"Two Beers Brewing Company","Seattle","WA","Panorama Wheat Ale (Two Beers Brewing Company)" +"2236",2236,0.063,69,2497,"Wobble","American IPA",74,16,"American IPA",75,"Two Brothers Brewing Company","Warrenville","IL","Wobble (Two Brothers Brewing Company)" +"2237",2237,0.0579999999999999,43,2246,"Night Cat","American Dark Wheat Ale",74,12,NA,75,"Two Brothers Brewing Company","Warrenville","IL","Night Cat (Two Brothers Brewing Company)" +"2238",2238,0.0579999999999999,43,1630,"Night Cat (2014)","American Dark Wheat Ale",74,12,NA,75,"Two Brothers Brewing Company","Warrenville","IL","Night Cat (2014) (Two Brothers Brewing Company)" +"2239",2239,0.051,17,1284,"Dog Days Lager","Dortmunder / Export Lager",74,12,NA,75,"Two Brothers Brewing Company","Warrenville","IL","Dog Days Lager (Two Brothers Brewing Company)" +"2240",2240,0.051,36,1121,"Sidekick Extra Pale Ale","American Pale Ale (APA)",74,12,"American Pale Ale (APA)",75,"Two Brothers Brewing Company","Warrenville","IL","Sidekick Extra Pale Ale (Two Brothers Brewing Company)" +"2241",2241,0.077,23,1042,"Atom Smasher","Märzen / Oktoberfest",74,12,NA,75,"Two Brothers Brewing Company","Warrenville","IL","Atom Smasher (Two Brothers Brewing Company)" +"2242",2242,0.045,NA,1041,"Testudo","Bière de Garde",74,12,NA,75,"Two Brothers Brewing Company","Warrenville","IL","Testudo (Two Brothers Brewing Company)" +"2243",2243,0.065,NA,1040,"Hobnob B & B Pale Ale","American Pale Ale (APA)",74,12,"American Pale Ale (APA)",75,"Two Brothers Brewing Company","Warrenville","IL","Hobnob B & B Pale Ale (Two Brothers Brewing Company)" +"2244",2244,0.07,68,861,"Cane and Ebel","American Strong Ale",74,12,NA,75,"Two Brothers Brewing Company","Warrenville","IL","Cane and Ebel (Two Brothers Brewing Company)" +"2245",2245,0.065,NA,642,"Outlaw IPA (2015)","American IPA",74,12,"American IPA",75,"Two Brothers Brewing Company","Warrenville","IL","Outlaw IPA (2015) (Two Brothers Brewing Company)" +"2246",2246,0.045,NA,2037,"The Gilded Age","Munich Helles Lager",243,12,NA,244,"Two Henrys Brewing Company","Plant City","FL","The Gilded Age (Two Henrys Brewing Company)" +"2247",2247,0.05,NA,1285,"No Limits Hefeweizen","Hefeweizen",435,16,NA,436,"Two Roads Brewing Company","Stratford","CT","No Limits Hefeweizen (Two Roads Brewing Company)" +"2248",2248,0.06,NA,1189,"Honeyspot Road White IPA","American White IPA",435,12,NA,436,"Two Roads Brewing Company","Stratford","CT","Honeyspot Road White IPA (Two Roads Brewing Company)" +"2249",2249,0.072,NA,1171,"Road 2 Ruin Double IPA","American Double / Imperial IPA",435,12,"American Double / Imperial IPA",436,"Two Roads Brewing Company","Stratford","CT","Road 2 Ruin Double IPA (Two Roads Brewing Company)" +"2250",2250,0.048,NA,1170,"Workers Comp Saison","Saison / Farmhouse Ale",435,12,NA,436,"Two Roads Brewing Company","Stratford","CT","Workers Comp Saison (Two Roads Brewing Company)" +"2251",2251,0.05,NA,1169,"Ol' Factory Pils","German Pilsener",435,12,NA,436,"Two Roads Brewing Company","Stratford","CT","Ol' Factory Pils (Two Roads Brewing Company)" +"2252",2252,0.05,10,2310,"PUNK'N","Pumpkin Ale",159,12,NA,160,"Uinta Brewing Company","Salt Lake City","UT","PUNK'N (Uinta Brewing Company)" +"2253",2253,0.04,22,2100,"Yard Sale Winter Lager","American Amber / Red Lager",159,12,NA,160,"Uinta Brewing Company","Salt Lake City","UT","Yard Sale Winter Lager (Uinta Brewing Company)" +"2254",2254,0.04,42,1925,"Trader Session IPA","American IPA",159,12,"American IPA",160,"Uinta Brewing Company","Salt Lake City","UT","Trader Session IPA (Uinta Brewing Company)" +"2255",2255,0.073,83,1723,"Hop Nosh IPA","American IPA",159,12,"American IPA",160,"Uinta Brewing Company","Salt Lake City","UT","Hop Nosh IPA (Uinta Brewing Company)" +"2256",2256,0.04,17,1212,"SUM'R","American Blonde Ale",159,12,"American Blonde Ale",160,"Uinta Brewing Company","Salt Lake City","UT","SUM'R (Uinta Brewing Company)" +"2257",2257,0.04,32,1097,"Organic Baba Black Lager","Schwarzbier",159,12,NA,160,"Uinta Brewing Company","Salt Lake City","UT","Organic Baba Black Lager (Uinta Brewing Company)" +"2258",2258,0.073,82,1089,"Hop Notch IPA (2013)","American IPA",159,12,"American IPA",160,"Uinta Brewing Company","Salt Lake City","UT","Hop Notch IPA (2013) (Uinta Brewing Company)" +"2259",2259,0.04,34,1088,"Cutthroat Pale Ale","American Pale Ale (APA)",159,12,"American Pale Ale (APA)",160,"Uinta Brewing Company","Salt Lake City","UT","Cutthroat Pale Ale (Uinta Brewing Company)" +"2260",2260,0.04,29,974,"WYLD Extra Pale Ale","American Pale Ale (APA)",159,12,"American Pale Ale (APA)",160,"Uinta Brewing Company","Salt Lake City","UT","WYLD Extra Pale Ale (Uinta Brewing Company)" +"2261",2261,0.055,NA,98,"Pilsner Ukiah","German Pilsener",555,12,NA,556,"Ukiah Brewing Company","Ukiah","CA","Pilsner Ukiah (Ukiah Brewing Company)" +"2262",2262,0.06,75,2372,"The Green Room","American IPA",126,16,"American IPA",127,"Uncle Billy's Brewery and Smokeh...","Austin","TX","The Green Room (Uncle Billy's Brewery and Smokeh...)" +"2263",2263,0.047,25,2367,"Humbucker Helles","Maibock / Helles Bock",126,16,NA,127,"Uncle Billy's Brewery and Smokeh...","Austin","TX","Humbucker Helles (Uncle Billy's Brewery and Smokeh...)" +"2264",2264,0.065,NA,1704,"Uncle John's Apple Cherry Cider","Cider",338,16,NA,339,"Uncle John's Fruit House Winery","St. John's","MI","Uncle John's Apple Cherry Cider (Uncle John's Fruit House Winery)" +"2265",2265,0.065,NA,1703,"Uncle John's Apricot Apple Cider","Cider",338,16,NA,339,"Uncle John's Fruit House Winery","St. John's","MI","Uncle John's Apricot Apple Cider (Uncle John's Fruit House Winery)" +"2266",2266,0.065,NA,877,"Draught Hard Apple Cider","Cider",338,16,NA,339,"Uncle John's Fruit House Winery","St. John's","MI","Draught Hard Apple Cider (Uncle John's Fruit House Winery)" +"2267",2267,0.001,NA,606,"Scotty K NA","Low Alcohol Beer",522,16,NA,523,"Uncommon Brewers","Santa Cruz","CA","Scotty K NA (Uncommon Brewers)" +"2268",2268,0.068,NA,543,"Bacon Brown Ale","American Brown Ale",522,16,NA,523,"Uncommon Brewers","Santa Cruz","CA","Bacon Brown Ale (Uncommon Brewers)" +"2269",2269,0.064,NA,347,"Golden State Ale","Belgian Pale Ale",522,16,NA,523,"Uncommon Brewers","Santa Cruz","CA","Golden State Ale (Uncommon Brewers)" +"2270",2270,0.078,NA,346,"Baltic Porter","Baltic Porter",522,16,NA,523,"Uncommon Brewers","Santa Cruz","CA","Baltic Porter (Uncommon Brewers)" +"2271",2271,0.085,NA,25,"Siamese twin","Dubbel",522,16,NA,523,"Uncommon Brewers","Santa Cruz","CA","Siamese twin (Uncommon Brewers)" +"2272",2272,0.085,90,2507,"Double Duckpin","American Double / Imperial IPA",71,12,"American Double / Imperial IPA",72,"Union Craft Brewing","Baltimore","MD","Double Duckpin (Union Craft Brewing)" +"2273",2273,0.042,10,2506,"Old Pro","Gose",71,12,NA,72,"Union Craft Brewing","Baltimore","MD","Old Pro (Union Craft Brewing)" +"2274",2274,0.055,NA,829,"Duckpin Pale Ale","American Pale Ale (APA)",71,12,"American Pale Ale (APA)",72,"Union Craft Brewing","Baltimore","MD","Duckpin Pale Ale (Union Craft Brewing)" +"2275",2275,0.06,NA,582,"Balt Altbier","Altbier",71,12,NA,72,"Union Craft Brewing","Baltimore","MD","Balt Altbier (Union Craft Brewing)" +"2276",2276,0.045,50,2190,"Campside Session IPA","American IPA",202,16,"American IPA",203,"Upland Brewing Company","Bloomington","IN","Campside Session IPA (Upland Brewing Company)" +"2277",2277,0.045,15,1951,"Upland Wheat Ale","Witbier",202,16,NA,203,"Upland Brewing Company","Bloomington","IN","Upland Wheat Ale (Upland Brewing Company)" +"2278",2278,0.06,NA,1950,"Dragonfly IPA","American IPA",202,16,"American IPA",203,"Upland Brewing Company","Bloomington","IN","Dragonfly IPA (Upland Brewing Company)" +"2279",2279,0.128,NA,2565,"Lee Hill Series Vol. 5 - Belgian Style Quadrupel Ale","Quadrupel (Quad)",51,19.2,NA,52,"Upslope Brewing Company","Boulder","CO","Lee Hill Series Vol. 5 - Belgian Style Quadrupel Ale (Upslope Brewing Company)" +"2280",2280,0.104,NA,2564,"Lee Hill Series Vol. 4 - Manhattan Style Rye Ale","Rye Beer",51,19.2,NA,52,"Upslope Brewing Company","Boulder","CO","Lee Hill Series Vol. 4 - Manhattan Style Rye Ale (Upslope Brewing Company)" +"2281",2281,0.068,24,2563,"Lee Hill Series Vol. 2 - Wild Saison","American Wild Ale",51,19.2,NA,52,"Upslope Brewing Company","Boulder","CO","Lee Hill Series Vol. 2 - Wild Saison (Upslope Brewing Company)" +"2282",2282,0.099,51,2562,"Lee Hill Series Vol. 3 - Barrel Aged Imperial Stout","American Double / Imperial Stout",51,19.2,NA,52,"Upslope Brewing Company","Boulder","CO","Lee Hill Series Vol. 3 - Barrel Aged Imperial Stout (Upslope Brewing Company)" +"2283",2283,0.076,NA,2561,"Lee Hill Series Vol. 1 - Barrel Aged Brown Ale","American Brown Ale",51,19.2,NA,52,"Upslope Brewing Company","Boulder","CO","Lee Hill Series Vol. 1 - Barrel Aged Brown Ale (Upslope Brewing Company)" +"2284",2284,0.06,NA,2560,"Blood Orange Saison","Saison / Farmhouse Ale",51,12,NA,52,"Upslope Brewing Company","Boulder","CO","Blood Orange Saison (Upslope Brewing Company)" +"2285",2285,0.065,33,1932,"Thai Style White IPA","American White IPA",51,12,NA,52,"Upslope Brewing Company","Boulder","CO","Thai Style White IPA (Upslope Brewing Company)" +"2286",2286,0.075,30,1853,"Ferus Fluxus Wild Belgian Pale Ale","American Wild Ale",51,19.2,NA,52,"Upslope Brewing Company","Boulder","CO","Ferus Fluxus Wild Belgian Pale Ale (Upslope Brewing Company)" +"2287",2287,0.099,90,1315,"Upslope Imperial India Pale Ale","American Double / Imperial IPA",51,19.2,"American Double / Imperial IPA",52,"Upslope Brewing Company","Boulder","CO","Upslope Imperial India Pale Ale (Upslope Brewing Company)" +"2288",2288,0.0819999999999999,NA,907,"Upslope Christmas Ale","Winter Warmer",51,16,NA,52,"Upslope Brewing Company","Boulder","CO","Upslope Christmas Ale (Upslope Brewing Company)" +"2289",2289,0.077,NA,906,"Upslope Pumpkin Ale","Pumpkin Ale",51,16,NA,52,"Upslope Brewing Company","Boulder","CO","Upslope Pumpkin Ale (Upslope Brewing Company)" +"2290",2290,0.075,30,683,"Upslope Belgian Style Pale Ale","Belgian Pale Ale",51,12,NA,52,"Upslope Brewing Company","Boulder","CO","Upslope Belgian Style Pale Ale (Upslope Brewing Company)" +"2291",2291,0.069,NA,614,"Upslope Foreign Style Stout","Foreign / Export Stout",51,12,NA,52,"Upslope Brewing Company","Boulder","CO","Upslope Foreign Style Stout (Upslope Brewing Company)" +"2292",2292,0.048,15,466,"Top Rope Mexican-style Craft Lager","Vienna Lager",51,12,NA,52,"Upslope Brewing Company","Boulder","CO","Top Rope Mexican-style Craft Lager (Upslope Brewing Company)" +"2293",2293,0.048,22,444,"Upslope Craft Lager","Vienna Lager",51,12,NA,52,"Upslope Brewing Company","Boulder","CO","Upslope Craft Lager (Upslope Brewing Company)" +"2294",2294,0.067,NA,345,"Upslope Brown Ale","English Brown Ale",51,12,NA,52,"Upslope Brewing Company","Boulder","CO","Upslope Brown Ale (Upslope Brewing Company)" +"2295",2295,0.0579999999999999,NA,80,"Upslope Pale Ale","American Pale Ale (APA)",51,12,"American Pale Ale (APA)",52,"Upslope Brewing Company","Boulder","CO","Upslope Pale Ale (Upslope Brewing Company)" +"2296",2296,0.072,NA,79,"Upslope India Pale Ale","American IPA",51,12,"American IPA",52,"Upslope Brewing Company","Boulder","CO","Upslope India Pale Ale (Upslope Brewing Company)" +"2297",2297,0.053,22,382,"Common Sense Kentucky Common Ale","American Brown Ale",546,16,NA,547,"Upstate Brewing Company","Elmira","NY","Common Sense Kentucky Common Ale (Upstate Brewing Company)" +"2298",2298,0.065,70,381,"Upstate I.P.W.","American IPA",546,12,"American IPA",547,"Upstate Brewing Company","Elmira","NY","Upstate I.P.W. (Upstate Brewing Company)" +"2299",2299,0.04,NA,1826,"Squatters Full Suspension Pale Ale","American Pale Ale (APA)",302,12,"American Pale Ale (APA)",303,"Utah Brewers Cooperative","Salt Lake City","UT","Squatters Full Suspension Pale Ale (Utah Brewers Cooperative)" +"2300",2300,0.09,75,1825,"Squatters Hop Rising Double IPA","American Double / Imperial IPA",302,12,"American Double / Imperial IPA",303,"Utah Brewers Cooperative","Salt Lake City","UT","Squatters Hop Rising Double IPA (Utah Brewers Cooperative)" +"2301",2301,0.08,NA,1824,"Devastator Double Bock","Doppelbock",302,12,NA,303,"Utah Brewers Cooperative","Salt Lake City","UT","Devastator Double Bock (Utah Brewers Cooperative)" +"2302",2302,0.06,NA,1823,"Wasatch Ghostrider White IPA","American White IPA",302,12,NA,303,"Utah Brewers Cooperative","Salt Lake City","UT","Wasatch Ghostrider White IPA (Utah Brewers Cooperative)" +"2303",2303,0.06,NA,1682,"Wasatch Ghostrider White IPA (2014)","American White IPA",302,12,NA,303,"Utah Brewers Cooperative","Salt Lake City","UT","Wasatch Ghostrider White IPA (2014) (Utah Brewers Cooperative)" +"2304",2304,0.04,NA,1681,"Wasatch Apricot Hefeweizen","Fruit / Vegetable Beer",302,12,NA,303,"Utah Brewers Cooperative","Salt Lake City","UT","Wasatch Apricot Hefeweizen (Utah Brewers Cooperative)" +"2305",2305,0.09,75,1680,"Squatters Hop Rising Double IPA (2014)","American Double / Imperial IPA",302,12,"American Double / Imperial IPA",303,"Utah Brewers Cooperative","Salt Lake City","UT","Squatters Hop Rising Double IPA (2014) (Utah Brewers Cooperative)" +"2306",2306,0.04,NA,1679,"Squatters Full Suspension Pale Ale","American Pale Ale (APA)",302,12,"American Pale Ale (APA)",303,"Utah Brewers Cooperative","Salt Lake City","UT","Squatters Full Suspension Pale Ale (Utah Brewers Cooperative)" +"2307",2307,0.068,NA,2245,"Nunica Pine","Cider",185,16,NA,186,"Vander Mill Ciders","Spring Lake","MI","Nunica Pine (Vander Mill Ciders)" +"2308",2308,0.069,NA,2244,"Ginger Peach","Cider",185,16,NA,186,"Vander Mill Ciders","Spring Lake","MI","Ginger Peach (Vander Mill Ciders)" +"2309",2309,0.068,NA,1378,"Totally Roasted","Cider",185,16,NA,186,"Vander Mill Ciders","Spring Lake","MI","Totally Roasted (Vander Mill Ciders)" +"2310",2310,0.068,NA,1377,"Blue Gold","Cider",185,16,NA,186,"Vander Mill Ciders","Spring Lake","MI","Blue Gold (Vander Mill Ciders)" +"2311",2311,0.068,NA,1376,"Hard Apple","Cider",185,16,NA,186,"Vander Mill Ciders","Spring Lake","MI","Hard Apple (Vander Mill Ciders)" +"2312",2312,0.052,NA,2411,"Nitro Can Coffee Stout","American Stout",113,12,NA,114,"Vault Brewing Company","Yardley","PA","Nitro Can Coffee Stout (Vault Brewing Company)" +"2313",2313,0.092,25,1770,"Voodoo Love Child","Tripel",322,12,NA,323,"Voodoo Brewery","Meadville","PA","Voodoo Love Child (Voodoo Brewery)" +"2314",2314,0.079,23,1769,"White Magick of the Sun","Witbier",322,12,NA,323,"Voodoo Brewery","Meadville","PA","White Magick of the Sun (Voodoo Brewery)" +"2315",2315,0.075,31,1730,"Wynona's Big Brown Ale","American Brown Ale",322,12,NA,323,"Voodoo Brewery","Meadville","PA","Wynona's Big Brown Ale (Voodoo Brewery)" +"2316",2316,0.092,25,1729,"Gran Met","Belgian Strong Pale Ale",322,12,NA,323,"Voodoo Brewery","Meadville","PA","Gran Met (Voodoo Brewery)" +"2317",2317,0.073,85,1603,"Good Vibes IPA","American IPA",322,12,"American IPA",323,"Voodoo Brewery","Meadville","PA","Good Vibes IPA (Voodoo Brewery)" +"2318",2318,0.075,85,1488,"Pilzilla","American Double / Imperial Pilsner",322,12,NA,323,"Voodoo Brewery","Meadville","PA","Pilzilla (Voodoo Brewery)" +"2319",2319,0.04,37,1846,"Wachusett Light IPA","American IPA",295,12,"American IPA",296,"Wachusett Brewing Company","Westminster","MA","Wachusett Light IPA (Wachusett Brewing Company)" +"2320",2320,0.06,55,1845,"Green Monsta IPA","American IPA",295,12,"American IPA",296,"Wachusett Brewing Company","Westminster","MA","Green Monsta IPA (Wachusett Brewing Company)" +"2321",2321,0.0559999999999999,50,1844,"Wachusett IPA","American IPA",295,12,"American IPA",296,"Wachusett Brewing Company","Westminster","MA","Wachusett IPA (Wachusett Brewing Company)" +"2322",2322,0.047,NA,1843,"Strawberry White","Witbier",295,12,NA,296,"Wachusett Brewing Company","Westminster","MA","Strawberry White (Wachusett Brewing Company)" +"2323",2323,0.085,85,1418,"Larry Imperial IPA","American Double / Imperial IPA",295,12,"American Double / Imperial IPA",296,"Wachusett Brewing Company","Westminster","MA","Larry Imperial IPA (Wachusett Brewing Company)" +"2324",2324,0.047,NA,1038,"Wachusett Summer","American Pale Wheat Ale",295,12,"American Pale Wheat Ale",296,"Wachusett Brewing Company","Westminster","MA","Wachusett Summer (Wachusett Brewing Company)" +"2325",2325,0.051,17,1030,"Country Pale Ale","English Pale Ale",295,12,NA,296,"Wachusett Brewing Company","Westminster","MA","Country Pale Ale (Wachusett Brewing Company)" +"2326",2326,0.04,37,1029,"Wachusett Light IPA (2013)","American IPA",295,12,"American IPA",296,"Wachusett Brewing Company","Westminster","MA","Wachusett Light IPA (2013) (Wachusett Brewing Company)" +"2327",2327,0.052,20,908,"Pumpkan","Pumpkin Ale",295,12,NA,296,"Wachusett Brewing Company","Westminster","MA","Pumpkan (Wachusett Brewing Company)" +"2328",2328,0.045,10,619,"Wachusett Blueberry Ale","Fruit / Vegetable Beer",295,12,NA,296,"Wachusett Brewing Company","Westminster","MA","Wachusett Blueberry Ale (Wachusett Brewing Company)" +"2329",2329,0.06,55,618,"Green Monsta IPA","American IPA",295,12,"American IPA",296,"Wachusett Brewing Company","Westminster","MA","Green Monsta IPA (Wachusett Brewing Company)" +"2330",2330,0.047,NA,780,"T-6 Red Ale (2004)","American Amber / Red Ale",506,12,"American Amber / Red Ale",507,"Warbird Brewing Company","Fort Wayne","IN","T-6 Red Ale (2004) (Warbird Brewing Company)" +"2331",2331,0.052,67,2450,"Self Starter","American IPA",94,16,"American IPA",95,"Warped Wing Brewing Company","Dayton","OH","Self Starter (Warped Wing Brewing Company)" +"2332",2332,0.054,20,2223,"Ermal's","Cream Ale",94,16,NA,95,"Warped Wing Brewing Company","Dayton","OH","Ermal's (Warped Wing Brewing Company)" +"2333",2333,0.07,NA,2222,"10 Ton","Oatmeal Stout",94,16,NA,95,"Warped Wing Brewing Company","Dayton","OH","10 Ton (Warped Wing Brewing Company)" +"2334",2334,0.07,NA,2221,"Flyin' Rye","American IPA",94,16,"American IPA",95,"Warped Wing Brewing Company","Dayton","OH","Flyin' Rye (Warped Wing Brewing Company)" +"2335",2335,0.09,NA,2439,"Christmas Ale","Herbed / Spiced Beer",100,12,NA,101,"West Sixth Brewing","Lexington","KY","Christmas Ale (West Sixth Brewing)" +"2336",2336,0.07,NA,2356,"Pay It Forward Cocoa Porter","American Porter",100,12,NA,101,"West Sixth Brewing","Lexington","KY","Pay It Forward Cocoa Porter (West Sixth Brewing)" +"2337",2337,0.055,NA,1069,"West Sixth Amber Ale","American Amber / Red Ale",100,12,"American Amber / Red Ale",101,"West Sixth Brewing","Lexington","KY","West Sixth Amber Ale (West Sixth Brewing)" +"2338",2338,NA,NA,652,"West Sixth IPA","American IPA",100,12,"American IPA",101,"West Sixth Brewing","Lexington","KY","West Sixth IPA (West Sixth Brewing)" +"2339",2339,0.055,NA,1542,"One Claw","American Pale Ale (APA)",384,12,"American Pale Ale (APA)",385,"Westbrook Brewing Company","Mt. Pleasant","SC","One Claw (Westbrook Brewing Company)" +"2340",2340,0.04,5,1312,"Westbrook Gose","Gose",384,12,NA,385,"Westbrook Brewing Company","Mt. Pleasant","SC","Westbrook Gose (Westbrook Brewing Company)" +"2341",2341,0.05,16,576,"White Thai","Witbier",384,12,NA,385,"Westbrook Brewing Company","Mt. Pleasant","SC","White Thai (Westbrook Brewing Company)" +"2342",2342,0.068,65,575,"Westbrook IPA","American IPA",384,12,"American IPA",385,"Westbrook Brewing Company","Mt. Pleasant","SC","Westbrook IPA (Westbrook Brewing Company)" +"2343",2343,0.057,22,1645,"Westfield Octoberfest","Märzen / Oktoberfest",351,12,NA,352,"Westfield River Brewing Company","Westfield","MA","Westfield Octoberfest (Westfield River Brewing Company)" +"2344",2344,0.052,NA,1551,"Pop's Old Fashioned Lager","American Amber / Red Lager",351,12,NA,352,"Westfield River Brewing Company","Westfield","MA","Pop's Old Fashioned Lager (Westfield River Brewing Company)" +"2345",2345,0.0579999999999999,55,1550,"Charlie in the Rye","American IPA",351,12,"American IPA",352,"Westfield River Brewing Company","Westfield","MA","Charlie in the Rye (Westfield River Brewing Company)" +"2346",2346,NA,NA,2364,"Royal Lager","American Pale Lager",132,16,NA,133,"Weston Brewing Company","Weston","MO","Royal Lager (Weston Brewing Company)" +"2347",2347,0.08,NA,2348,"Rip Van Winkle (Current)","Bock",132,12,NA,133,"Weston Brewing Company","Weston","MO","Rip Van Winkle (Current) (Weston Brewing Company)" +"2348",2348,NA,NA,2344,"O’Malley’s Stout","English Stout",132,12,NA,133,"Weston Brewing Company","Weston","MO","O’Malley’s Stout (Weston Brewing Company)" +"2349",2349,0.075,89,2343,"O’Malley’s IPA","American IPA",132,12,"American IPA",133,"Weston Brewing Company","Weston","MO","O’Malley’s IPA (Weston Brewing Company)" +"2350",2350,NA,NA,2342,"O’Malley’s Irish Style Cream Ale","Cream Ale",132,12,NA,133,"Weston Brewing Company","Weston","MO","O’Malley’s Irish Style Cream Ale (Weston Brewing Company)" +"2351",2351,0.049,28,2341,"L'il Lucy's Hot Pepper Ale","Chile Beer",132,12,NA,133,"Weston Brewing Company","Weston","MO","L'il Lucy's Hot Pepper Ale (Weston Brewing Company)" +"2352",2352,0.052,NA,2340,"Drop Kick Ale","American Amber / Red Ale",132,12,"American Amber / Red Ale",133,"Weston Brewing Company","Weston","MO","Drop Kick Ale (Weston Brewing Company)" +"2353",2353,0.055,NA,2573,"Raspberry Berliner Weisse","Berliner Weissbier",47,12,NA,48,"White Birch Brewing","Hooksett","NH","Raspberry Berliner Weisse (White Birch Brewing)" +"2354",2354,0.05,NA,2572,"Hop Session","American IPA",47,12,"American IPA",48,"White Birch Brewing","Hooksett","NH","Hop Session (White Birch Brewing)" +"2355",2355,0.055,NA,2571,"Blueberry Berliner Weisse","Berliner Weissbier",47,12,NA,48,"White Birch Brewing","Hooksett","NH","Blueberry Berliner Weisse (White Birch Brewing)" +"2356",2356,0.055,NA,2570,"Berliner Weisse","Berliner Weissbier",47,12,NA,48,"White Birch Brewing","Hooksett","NH","Berliner Weisse (White Birch Brewing)" +"2357",2357,0.06,NA,1498,"Super G IPA","American IPA",396,16,"American IPA",397,"White Flame Brewing Company","Hudsonville","MI","Super G IPA (White Flame Brewing Company)" +"2358",2358,0.049,30,1838,"Hefe Lemon","Radler",296,12,NA,297,"Widmer Brothers Brewing Company","Portland","OR","Hefe Lemon (Widmer Brothers Brewing Company)" +"2359",2359,0.049,30,1837,"Hefe Black","Hefeweizen",296,12,NA,297,"Widmer Brothers Brewing Company","Portland","OR","Hefe Black (Widmer Brothers Brewing Company)" +"2360",2360,0.049,30,1836,"Widmer Brothers Hefeweizen","Hefeweizen",296,12,NA,297,"Widmer Brothers Brewing Company","Portland","OR","Widmer Brothers Hefeweizen (Widmer Brothers Brewing Company)" +"2361",2361,0.0819999999999999,100,1619,"Hop Slayer Double IPA","American Double / Imperial IPA",361,12,"American Double / Imperial IPA",362,"Wild Onion Brewing Company","Lake Barrington","IL","Hop Slayer Double IPA (Wild Onion Brewing Company)" +"2362",2362,0.045,NA,1618,"Pumpkin Ale","Pumpkin Ale",361,12,NA,362,"Wild Onion Brewing Company","Lake Barrington","IL","Pumpkin Ale (Wild Onion Brewing Company)" +"2363",2363,0.05,NA,1364,"Big Bowl Blonde Ale","American Brown Ale",361,12,NA,362,"Wild Onion Brewing Company","Lake Barrington","IL","Big Bowl Blonde Ale (Wild Onion Brewing Company)" +"2364",2364,0.052,27,971,"Phat Chance","American Blonde Ale",361,12,"American Blonde Ale",362,"Wild Onion Brewing Company","Lake Barrington","IL","Phat Chance (Wild Onion Brewing Company)" +"2365",2365,0.0819999999999999,100,740,"Hop Slayer Double IPA (2011)","American Double / Imperial IPA",361,12,"American Double / Imperial IPA",362,"Wild Onion Brewing Company","Lake Barrington","IL","Hop Slayer Double IPA (2011) (Wild Onion Brewing Company)" +"2366",2366,0.0819999999999999,100,430,"Hop Slayer Double IPA (2011)","American Double / Imperial IPA",361,12,"American Double / Imperial IPA",362,"Wild Onion Brewing Company","Lake Barrington","IL","Hop Slayer Double IPA (2011) (Wild Onion Brewing Company)" +"2367",2367,0.042,13,398,"Wild Onion Summer Wit","Witbier",361,12,NA,362,"Wild Onion Brewing Company","Lake Barrington","IL","Wild Onion Summer Wit (Wild Onion Brewing Company)" +"2368",2368,0.06,23,366,"Jack Stout","Oatmeal Stout",361,12,NA,362,"Wild Onion Brewing Company","Lake Barrington","IL","Jack Stout (Wild Onion Brewing Company)" +"2369",2369,0.045,NA,334,"Wild Onion Pumpkin Ale (2010)","Pumpkin Ale",361,12,NA,362,"Wild Onion Brewing Company","Lake Barrington","IL","Wild Onion Pumpkin Ale (2010) (Wild Onion Brewing Company)" +"2370",2370,0.0559999999999999,41,162,"Paddy Pale Ale","American Pale Ale (APA)",361,12,"American Pale Ale (APA)",362,"Wild Onion Brewing Company","Lake Barrington","IL","Paddy Pale Ale (Wild Onion Brewing Company)" +"2371",2371,0.068,21,2253,"Blonde Hunny","Belgian Pale Ale",181,12,NA,182,"Wild Wolf Brewing Company","Nellysford","VA","Blonde Hunny (Wild Wolf Brewing Company)" +"2372",2372,0.057,20,1318,"Wild Wolf Wee Heavy Scottish Style Ale","Scotch Ale / Wee Heavy",181,12,NA,182,"Wild Wolf Brewing Company","Nellysford","VA","Wild Wolf Wee Heavy Scottish Style Ale (Wild Wolf Brewing Company)" +"2373",2373,0.045,25,1195,"Wild Wolf American Pilsner","American Pilsner",181,12,NA,182,"Wild Wolf Brewing Company","Nellysford","VA","Wild Wolf American Pilsner (Wild Wolf Brewing Company)" +"2374",2374,0.051,45,1194,"Alpha Ale","American Pale Ale (APA)",181,12,"American Pale Ale (APA)",182,"Wild Wolf Brewing Company","Nellysford","VA","Alpha Ale (Wild Wolf Brewing Company)" +"2375",2375,0.054,NA,826,"Mystical Stout","Irish Dry Stout",499,16,NA,500,"Wildwood Brewing Company","Stevensville","MT","Mystical Stout (Wildwood Brewing Company)" +"2376",2376,0.075,NA,825,"Bodacious Bock","Bock",499,16,NA,500,"Wildwood Brewing Company","Stevensville","MT","Bodacious Bock (Wildwood Brewing Company)" +"2377",2377,0.05,NA,813,"Ambitious Lager","Munich Helles Lager",499,16,NA,500,"Wildwood Brewing Company","Stevensville","MT","Ambitious Lager (Wildwood Brewing Company)" +"2378",2378,0.072,NA,324,"Wyoming Pale Ale","American Pale Ale (APA)",550,16,"American Pale Ale (APA)",551,"Wind River Brewing Company","Pinedale","WY","Wyoming Pale Ale (Wind River Brewing Company)" +"2379",2379,0.05,NA,323,"Wind River Blonde Ale","American Blonde Ale",550,16,"American Blonde Ale",551,"Wind River Brewing Company","Pinedale","WY","Wind River Blonde Ale (Wind River Brewing Company)" +"2380",2380,0.074,83,762,"Ace IPA","American IPA",509,16,"American IPA",510,"Wingman Brewers","Tacoma","WA","Ace IPA (Wingman Brewers)" +"2381",2381,0.08,31,761,"P-51 Porter","American Porter",509,16,NA,510,"Wingman Brewers","Tacoma","WA","P-51 Porter (Wingman Brewers)" +"2382",2382,0.055,NA,2149,"#001 Golden Amber Lager","American Amber / Red Lager",211,12,NA,212,"Wisconsin Brewing Company","Verona","WI","#001 Golden Amber Lager (Wisconsin Brewing Company)" +"2383",2383,0.071,60,2148,"#002 American I.P.A.","American IPA",211,12,"American IPA",212,"Wisconsin Brewing Company","Verona","WI","#002 American I.P.A. (Wisconsin Brewing Company)" +"2384",2384,0.052,NA,2147,"#003 Brown & Robust Porter","American Porter",211,12,NA,212,"Wisconsin Brewing Company","Verona","WI","#003 Brown & Robust Porter (Wisconsin Brewing Company)" +"2385",2385,0.048,38,2146,"#004 Session I.P.A.","American IPA",211,12,"American IPA",212,"Wisconsin Brewing Company","Verona","WI","#004 Session I.P.A. (Wisconsin Brewing Company)" +"2386",2386,0.059,NA,2047,"Tarasque","Saison / Farmhouse Ale",239,12,NA,240,"Wiseacre Brewing Company","Memphis","TN","Tarasque (Wiseacre Brewing Company)" +"2387",2387,0.062,61,1470,"Ananda India Pale Ale","American IPA",239,12,"American IPA",240,"Wiseacre Brewing Company","Memphis","TN","Ananda India Pale Ale (Wiseacre Brewing Company)" +"2388",2388,0.045,23,1469,"Tiny Bomb","American Pilsner",239,12,NA,240,"Wiseacre Brewing Company","Memphis","TN","Tiny Bomb (Wiseacre Brewing Company)" +"2389",2389,0.0579999999999999,72,2627,"Train Hopper","American IPA",14,12,"American IPA",15,"Witch's Hat Brewing Company","South Lyon","MI","Train Hopper (Witch's Hat Brewing Company)" +"2390",2390,0.045,NA,2626,"Edward’s Portly Brown","American Brown Ale",14,12,NA,15,"Witch's Hat Brewing Company","South Lyon","MI","Edward’s Portly Brown (Witch's Hat Brewing Company)" +"2391",2391,0.059,135,1676,"Troopers Alley IPA","American IPA",344,12,"American IPA",345,"Wolf Hills Brewing Company","Abingdon","VA","Troopers Alley IPA (Wolf Hills Brewing Company)" +"2392",2392,0.047,15,1468,"Wolverine Premium Lager","American Pale Lager",402,12,NA,403,"Wolverine State Brewing Company","Ann Arbor","MI","Wolverine Premium Lager (Wolverine State Brewing Company)" +"2393",2393,0.05,NA,822,"Woodchuck Amber Hard Cider","Cider",501,12,NA,502,"Woodchuck Hard Cider","Middlebury","VT","Woodchuck Amber Hard Cider (Woodchuck Hard Cider)" +"2394",2394,0.065,82,2417,"4000 Footer IPA","American IPA",109,12,"American IPA",110,"Woodstock Inn, Station & Brewery","North Woodstock","NH","4000 Footer IPA (Woodstock Inn, Station & Brewery)" +"2395",2395,0.0279999999999999,15,2306,"Summer Brew","American Pilsner",109,12,NA,110,"Woodstock Inn, Station & Brewery","North Woodstock","NH","Summer Brew (Woodstock Inn, Station & Brewery)" +"2396",2396,0.065,69,1697,"Be Hoppy IPA","American IPA",339,16,"American IPA",340,"Wormtown Brewery","Worcester","MA","Be Hoppy IPA (Wormtown Brewery)" +"2397",2397,0.069,69,2194,"Worthy IPA","American IPA",199,12,"American IPA",200,"Worthy Brewing Company","Bend","OR","Worthy IPA (Worthy Brewing Company)" +"2398",2398,0.045,25,1514,"Easy Day Kolsch","Kölsch",199,12,NA,200,"Worthy Brewing Company","Bend","OR","Easy Day Kolsch (Worthy Brewing Company)" +"2399",2399,0.077,30,1513,"Lights Out Vanilla Cream Extra Stout","American Double / Imperial IPA",199,12,"American Double / Imperial IPA",200,"Worthy Brewing Company","Bend","OR","Lights Out Vanilla Cream Extra Stout (Worthy Brewing Company)" +"2400",2400,0.069,69,1512,"Worthy IPA (2013)","American IPA",199,12,"American IPA",200,"Worthy Brewing Company","Bend","OR","Worthy IPA (2013) (Worthy Brewing Company)" +"2401",2401,0.06,50,1511,"Worthy Pale","American Pale Ale (APA)",199,12,"American Pale Ale (APA)",200,"Worthy Brewing Company","Bend","OR","Worthy Pale (Worthy Brewing Company)" +"2402",2402,0.042,NA,1345,"Patty's Chile Beer","Chile Beer",424,12,NA,425,"Wynkoop Brewing Company","Denver","CO","Patty's Chile Beer (Wynkoop Brewing Company)" +"2403",2403,0.0819999999999999,NA,1316,"Colorojo Imperial Red Ale","American Strong Ale",424,12,NA,425,"Wynkoop Brewing Company","Denver","CO","Colorojo Imperial Red Ale (Wynkoop Brewing Company)" +"2404",2404,0.055,NA,1045,"Wynkoop Pumpkin Ale","Pumpkin Ale",424,12,NA,425,"Wynkoop Brewing Company","Denver","CO","Wynkoop Pumpkin Ale (Wynkoop Brewing Company)" +"2405",2405,0.075,NA,1035,"Rocky Mountain Oyster Stout","American Stout",424,12,NA,425,"Wynkoop Brewing Company","Denver","CO","Rocky Mountain Oyster Stout (Wynkoop Brewing Company)" +"2406",2406,0.067,45,928,"Belgorado","Belgian IPA",424,12,NA,425,"Wynkoop Brewing Company","Denver","CO","Belgorado (Wynkoop Brewing Company)" +"2407",2407,0.052,NA,807,"Rail Yard Ale","American Amber / Red Ale",424,12,"American Amber / Red Ale",425,"Wynkoop Brewing Company","Denver","CO","Rail Yard Ale (Wynkoop Brewing Company)" +"2408",2408,0.055,NA,620,"B3K Black Lager","Schwarzbier",424,12,NA,425,"Wynkoop Brewing Company","Denver","CO","B3K Black Lager (Wynkoop Brewing Company)" +"2409",2409,0.055,40,145,"Silverback Pale Ale","American Pale Ale (APA)",424,12,"American Pale Ale (APA)",425,"Wynkoop Brewing Company","Denver","CO","Silverback Pale Ale (Wynkoop Brewing Company)" +"2410",2410,0.052,NA,84,"Rail Yard Ale (2009)","American Amber / Red Ale",424,12,"American Amber / Red Ale",425,"Wynkoop Brewing Company","Denver","CO","Rail Yard Ale (2009) (Wynkoop Brewing Company)" \ No newline at end of file From f0f2cdaa75cf344cd2113e3722e1cfd08f9e08d0 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 10 Oct 2022 15:04:52 -0400 Subject: [PATCH 086/114] disable flyway in h2 --- src/main/resources/application-localmysql.properties | 1 + src/main/resources/application.properties | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties index 31f26ea2f..bd42d8012 100644 --- a/src/main/resources/application-localmysql.properties +++ b/src/main/resources/application-localmysql.properties @@ -5,6 +5,7 @@ spring.jpa.database=mysql spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=validate +spring.flyway.enabled=true spring.datasource.hikari.pool-name=RestDB-Pool spring.datasource.hikari.maximum-pool-size=5 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6405ef234..1d00f86d2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ logging.level.guru.springframework=debug - +spring.flyway.enabled=false #spring.jpa.properties.jakarta.persistence.schema-generation.scripts.action=drop-and-create #spring.jpa.properties.jakarta.persistence.schema-generation.scripts.create-source=metadata From 23bf3b777cfa359c78b211255a86d686d9df2eb1 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 27 Aug 2022 13:35:00 -0400 Subject: [PATCH 087/114] adding init scripts for MySQL --- src/scripts/mysql-init.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/scripts/mysql-init.sql diff --git a/src/scripts/mysql-init.sql b/src/scripts/mysql-init.sql new file mode 100644 index 000000000..84ccd80c2 --- /dev/null +++ b/src/scripts/mysql-init.sql @@ -0,0 +1,6 @@ +DROP DATABASE IF EXISTS restdb; +DROP USER IF EXISTS `restadmin`@`%`; +CREATE DATABASE IF NOT EXISTS restdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE USER IF NOT EXISTS `restadmin`@`%` IDENTIFIED WITH mysql_native_password BY 'password'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, EXECUTE, CREATE VIEW, SHOW VIEW, +CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `restdb`.* TO `restadmin`@`%`; \ No newline at end of file From 7063e63d60ad02162f7fcb028651ac2829576167 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 2 May 2024 16:19:55 -0400 Subject: [PATCH 088/114] update mysql dep to to change in Spring Boot 3.0.3 --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 88b681e23..984ed19a8 100644 --- a/pom.xml +++ b/pom.xml @@ -35,8 +35,9 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j + runtime com.h2database From f96a3f60b29de70151e797044e49297a9c4bb0ea Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 2 May 2024 16:21:04 -0400 Subject: [PATCH 089/114] update mysql dep to to change in Spring Boot 3.0.3 --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index edd81ad13..5c7aac244 100644 --- a/pom.xml +++ b/pom.xml @@ -35,8 +35,9 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j + runtime com.h2database From 0ae2e4069f408706e254ea5de9de355115ba1a3e Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 8 Jun 2024 09:57:16 -0400 Subject: [PATCH 090/114] updating java version in compiler config --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 952473e14..dbfa6475d 100644 --- a/pom.xml +++ b/pom.xml @@ -71,8 +71,8 @@ maven-compiler-plugin 3.10.1 - 17 - 17 + 21 + 21 org.mapstruct From 61c286d7e6d7a1cc2628e688c0987c0063fe939a Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 8 Jun 2024 12:07:46 -0400 Subject: [PATCH 091/114] fix for change in hibernate schema validation --- .../java/guru/springframework/spring6restmvc/entities/Beer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index 598d91e3a..27c2977ec 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -42,6 +42,7 @@ public class Beer { private String beerName; @NotNull + @JdbcTypeCode(value = SqlTypes.SMALLINT) private BeerStyle beerStyle; @NotNull From 41fa54c0e33ae7e05be8d57438de4c71f042cb3b Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 23 Nov 2024 13:14:41 -0500 Subject: [PATCH 092/114] Update of deprecated @MockBean to @MockitoBean --- .../spring6restmvc/controller/BeerControllerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index 381786a1d..e3f4ba306 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -4,8 +4,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import java.util.UUID; @@ -19,7 +19,7 @@ class BeerControllerTest { @Autowired MockMvc mockMvc; - @MockBean + @MockitoBean BeerService beerService; @Test From 4aacf75531747d789f657e73306870c47f617c7b Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 9 Aug 2022 10:49:37 -0400 Subject: [PATCH 093/114] adding tests for customer --- .../controller/CustomerControllerTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java new file mode 100644 index 000000000..78e89f326 --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -0,0 +1,63 @@ +package guru.springframework.spring6restmvc.controller; + +import guru.springframework.spring6restmvc.model.Customer; +import guru.springframework.spring6restmvc.services.CustomerService; +import guru.springframework.spring6restmvc.services.CustomerServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.hamcrest.core.Is.is; +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(CustomerController.class) +class CustomerControllerTest { + + @MockBean + CustomerService customerService; + + @Autowired + MockMvc mockMvc; + + CustomerServiceImpl customerServiceImpl = new CustomerServiceImpl(); + + @Test + void listAllCustomers() throws Exception { + given(customerService.getAllCustomers()).willReturn(customerServiceImpl.getAllCustomers()); + + mockMvc.perform(get("/api/v1/customer") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.length()", is(3))); + } + + @Test + void getCustomerById() throws Exception { + Customer customer = customerServiceImpl.getAllCustomers().get(0); + + given(customerService.getCustomerById(customer.getId())).willReturn(customer); + + mockMvc.perform(get("/api/v1/customer/" + customer.getId()) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.name", is(customer.getName()))); + + } +} + + + + + + + + + + From cd4d295b424988679951b64a85348dc8b7304553 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 23 Nov 2024 13:55:21 -0500 Subject: [PATCH 094/114] Update UUID Generator to @UuidGenerator --- .../guru/springframework/spring6restmvc/entities/Beer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index d361c375a..710ae5970 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -3,7 +3,7 @@ import guru.springframework.spring6restmvc.model.BeerStyle; import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.UuidGenerator; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -22,7 +22,7 @@ public class Beer { @Id @GeneratedValue(generator = "UUID") - @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + @UuidGenerator @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) private UUID id; From 358338f0f5ba2d4cb2764b569f1814e7ad49f781 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 23 Nov 2024 13:58:23 -0500 Subject: [PATCH 095/114] Update UUID Generator to @UuidGenerator --- .../springframework/spring6restmvc/entities/Customer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java index c9d6f1c4f..34f862238 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -2,7 +2,7 @@ import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.UuidGenerator; import java.time.LocalDateTime; import java.util.UUID; @@ -19,7 +19,7 @@ public class Customer { @Id @GeneratedValue(generator = "UUID") - @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + @UuidGenerator @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) private UUID id; private String name; From 611b16747d18590cca6e7ef8000de00324e620b5 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 23 Nov 2024 14:37:59 -0500 Subject: [PATCH 096/114] Fix failing tests with UUID load --- .../spring6restmvc/bootstrap/BootstrapData.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java b/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java index 6209415a0..0856801c0 100644 --- a/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java +++ b/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java @@ -12,7 +12,6 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; -import java.util.UUID; /** * Created by jt, Spring Framework Guru. @@ -72,7 +71,6 @@ private void loadCustomerData() { if (customerRepository.count() == 0) { Customer customer1 = Customer.builder() - .id(UUID.randomUUID()) .name("Customer 1") .version(1) .createdDate(LocalDateTime.now()) @@ -80,7 +78,6 @@ private void loadCustomerData() { .build(); Customer customer2 = Customer.builder() - .id(UUID.randomUUID()) .name("Customer 2") .version(1) .createdDate(LocalDateTime.now()) @@ -88,7 +85,6 @@ private void loadCustomerData() { .build(); Customer customer3 = Customer.builder() - .id(UUID.randomUUID()) .name("Customer 3") .version(1) .createdDate(LocalDateTime.now()) From 65b72b6f0fe29cb27122e31b05359011f35311dd Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 23 Nov 2024 14:51:10 -0500 Subject: [PATCH 097/114] update to use MockitoBean --- .../spring6restmvc/controller/CustomerControllerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java index 78e89f326..7503634f1 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/CustomerControllerTest.java @@ -6,8 +6,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import static org.hamcrest.core.Is.is; @@ -18,7 +18,7 @@ @WebMvcTest(CustomerController.class) class CustomerControllerTest { - @MockBean + @MockitoBean CustomerService customerService; @Autowired From a60cbea1b32e6796d596bbf42d0b84642e61fe5a Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 13 Aug 2022 15:39:30 -0400 Subject: [PATCH 098/114] adding JPA Entities --- .../spring6restmvc/entities/Beer.java | 36 +++++++++++++++++++ .../spring6restmvc/entities/Customer.java | 30 ++++++++++++++++ .../spring6restmvc/model/CustomerDTO.java | 3 +- 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/main/java/guru/springframework/spring6restmvc/entities/Beer.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/entities/Customer.java diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java new file mode 100644 index 000000000..bb54f46a4 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -0,0 +1,36 @@ +package guru.springframework.spring6restmvc.entities; + +import guru.springframework.spring6restmvc.model.BeerStyle; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Version; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Getter +@Setter +@Builder +@Entity +@NoArgsConstructor +@AllArgsConstructor +public class Beer { + + @Id + private UUID id; + + @Version + private Integer version; + private String beerName; + private BeerStyle beerStyle; + private String upc; + private Integer quantityOnHand; + private BigDecimal price; + private LocalDateTime createdDate; + private LocalDateTime updateDate; +} diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java new file mode 100644 index 000000000..905980bfe --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -0,0 +1,30 @@ +package guru.springframework.spring6restmvc.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Version; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Created by jt, Spring Framework Guru. + */ +@Getter +@Setter +@Builder +@Entity +@AllArgsConstructor +@NoArgsConstructor +public class Customer { + + @Id + private UUID id; + private String name; + + @Version + private Integer version; + private LocalDateTime createdDate; + private LocalDateTime updateDate; +} diff --git a/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java b/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java index a77044fbe..c35be5b4c 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/CustomerDTO.java @@ -12,9 +12,8 @@ @Data @Builder public class CustomerDTO { - - private String name; private UUID id; + private String name; private Integer version; private LocalDateTime createdDate; private LocalDateTime updateDate; From bd8ea18f92ff77a0b85f88bece2abca9bb9bcc97 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 23 Nov 2024 15:02:24 -0500 Subject: [PATCH 099/114] update to use uuidgenerator --- .../springframework/spring6restmvc/entities/Customer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java index c9d6f1c4f..34f862238 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -2,7 +2,7 @@ import jakarta.persistence.*; import lombok.*; -import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.UuidGenerator; import java.time.LocalDateTime; import java.util.UUID; @@ -19,7 +19,7 @@ public class Customer { @Id @GeneratedValue(generator = "UUID") - @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") + @UuidGenerator @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) private UUID id; private String name; From d32732a55497eb526e419f139c3bcc5679652cbc Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 27 Aug 2022 13:48:41 -0400 Subject: [PATCH 100/114] adding deps for mysql --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 016a6eb7e..61f8914cb 100644 --- a/pom.xml +++ b/pom.xml @@ -34,9 +34,14 @@ org.springframework.boot spring-boot-starter-data-jpa + + mysql + mysql-connector-java + com.h2database h2 + runtime From 0fa9390281114145694f2ac9188d46a6c63496f8 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 2 May 2024 16:21:04 -0400 Subject: [PATCH 101/114] update mysql dep to to change in Spring Boot 3.0.3 --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 61f8914cb..c6865bfc8 100644 --- a/pom.xml +++ b/pom.xml @@ -35,8 +35,9 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j + runtime com.h2database From ded3030f1f186cd8e7b8f90d37af16ee8fa09f4d Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 23 Nov 2024 15:42:39 -0500 Subject: [PATCH 102/114] fix merge error --- .../java/guru/springframework/spring6restmvc/entities/Beer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index 6e0e31006..810e7c898 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -6,7 +6,9 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.*; +import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.annotations.UuidGenerator; +import org.hibernate.type.SqlTypes; import java.math.BigDecimal; import java.time.LocalDateTime; From b473c54ef0c0a09ad16d9441e55bb818696f2d77 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 26 Nov 2024 14:54:56 -0500 Subject: [PATCH 103/114] adding @jdbcTypeCode for UUID values with MySQL --- .../guru/springframework/spring6restmvc/entities/Beer.java | 3 +++ .../guru/springframework/spring6restmvc/entities/Customer.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index 808dab114..d385a8216 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -6,7 +6,9 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.*; +import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.annotations.UuidGenerator; +import org.hibernate.type.SqlTypes; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -27,6 +29,7 @@ public class Beer { @GeneratedValue(generator = "UUID") @UuidGenerator @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) + @JdbcTypeCode(SqlTypes.CHAR) private UUID id; @Version diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java index 34f862238..3d16fc42a 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Customer.java @@ -2,7 +2,9 @@ import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.annotations.UuidGenerator; +import org.hibernate.type.SqlTypes; import java.time.LocalDateTime; import java.util.UUID; @@ -21,6 +23,7 @@ public class Customer { @GeneratedValue(generator = "UUID") @UuidGenerator @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false) + @JdbcTypeCode(SqlTypes.CHAR) private UUID id; private String name; From a88e39005e49f9c163d191381dec4fc5cdec9aed Mon Sep 17 00:00:00 2001 From: John Thompson Date: Tue, 26 Nov 2024 15:38:09 -0500 Subject: [PATCH 104/114] adding deps for test containers --- pom.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pom.xml b/pom.xml index 111d853b5..3d659750b 100644 --- a/pom.xml +++ b/pom.xml @@ -63,6 +63,21 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-testcontainers + test + + + org.testcontainers + junit-jupiter + test + + + org.testcontainers + mysql + test + From a7756528e6a3b7aa6a7b5668bcdcdce99429ea7e Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 27 Nov 2024 07:28:38 -0500 Subject: [PATCH 105/114] adding test with dynamic properties --- .../repositories/MySqlTest.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java diff --git a/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java b/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java new file mode 100644 index 000000000..03669b8d0 --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java @@ -0,0 +1,49 @@ +package guru.springframework.spring6restmvc.repositories; + +import guru.springframework.spring6restmvc.entities.Beer; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import javax.sql.DataSource; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Created by jt, Spring Framework Guru. + */ +@Testcontainers +@SpringBootTest +@ActiveProfiles("localmysql") +public class MySqlTest { + + @Container + static MySQLContainer mySQLContainer = new MySQLContainer<>("mysql:9"); + + @DynamicPropertySource + static void mySqlProperties(DynamicPropertyRegistry registry) { + registry.add("spring.datasource.username", mySQLContainer::getUsername); + registry.add("spring.datasource.password", mySQLContainer::getPassword); + registry.add("spring.datasource.url", mySQLContainer::getJdbcUrl); + } + + @Autowired + DataSource dataSource; + + @Autowired + BeerRepository beerRepository; + + @Test + void testListBeers() { + List beers = beerRepository.findAll(); + + assertThat(beers.size()).isGreaterThan(0); + } +} From 8fb5ca40994ba56f0e05f4053e72141be739718b Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 27 Nov 2024 08:09:55 -0500 Subject: [PATCH 106/114] refactor to use service connection --- .../spring6restmvc/repositories/MySqlTest.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java b/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java index 03669b8d0..9663db1f1 100644 --- a/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java @@ -4,14 +4,12 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import javax.sql.DataSource; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -25,18 +23,9 @@ public class MySqlTest { @Container + @ServiceConnection static MySQLContainer mySQLContainer = new MySQLContainer<>("mysql:9"); - @DynamicPropertySource - static void mySqlProperties(DynamicPropertyRegistry registry) { - registry.add("spring.datasource.username", mySQLContainer::getUsername); - registry.add("spring.datasource.password", mySQLContainer::getPassword); - registry.add("spring.datasource.url", mySQLContainer::getJdbcUrl); - } - - @Autowired - DataSource dataSource; - @Autowired BeerRepository beerRepository; From 293a9a4c6c57a2e953dd13d0557fdb55b485c2e3 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 27 Nov 2024 09:29:26 -0500 Subject: [PATCH 107/114] adding failsafe config and example --- pom.xml | 13 +++++++++++++ .../repositories/{MySqlTest.java => MySqlIT.java} | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) rename src/test/java/guru/springframework/spring6restmvc/repositories/{MySqlTest.java => MySqlIT.java} (97%) diff --git a/pom.xml b/pom.xml index 3d659750b..b64d08ddc 100644 --- a/pom.xml +++ b/pom.xml @@ -123,6 +123,19 @@ + + org.apache.maven.plugins + maven-failsafe-plugin + 3.5.2 + + + + integration-test + verify + + + + diff --git a/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java b/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlIT.java similarity index 97% rename from src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java rename to src/test/java/guru/springframework/spring6restmvc/repositories/MySqlIT.java index 9663db1f1..c874eba56 100644 --- a/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/repositories/MySqlIT.java @@ -20,7 +20,7 @@ @Testcontainers @SpringBootTest @ActiveProfiles("localmysql") -public class MySqlTest { +public class MySqlIT { @Container @ServiceConnection From 92dab440afb08ed513faa0c64f8eb98e599a49b0 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 27 Nov 2024 11:12:11 -0500 Subject: [PATCH 108/114] adding docker compose --- compose.yaml | 10 ++++++++++ pom.xml | 6 ++++++ src/main/resources/application-localmysql.properties | 1 + src/main/resources/application.properties | 2 ++ 4 files changed, 19 insertions(+) create mode 100644 compose.yaml diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 000000000..4d2047e19 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,10 @@ +services: + mysql: + image: 'mysql:latest' + environment: + - 'MYSQL_DATABASE=mydatabase' + - 'MYSQL_PASSWORD=secret' + - 'MYSQL_ROOT_PASSWORD=verysecret' + - 'MYSQL_USER=myuser' + ports: + - '3306' diff --git a/pom.xml b/pom.xml index b64d08ddc..763802622 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,12 @@ mapstruct ${org.mapstruct.version} + + org.springframework.boot + spring-boot-docker-compose + runtime + true + org.springframework.boot spring-boot-starter-test diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties index bd42d8012..74841e13a 100644 --- a/src/main/resources/application-localmysql.properties +++ b/src/main/resources/application-localmysql.properties @@ -6,6 +6,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=validate spring.flyway.enabled=true +spring.docker.compose.enabled=true spring.datasource.hikari.pool-name=RestDB-Pool spring.datasource.hikari.maximum-pool-size=5 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1d00f86d2..b4244e889 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,6 +2,8 @@ logging.level.guru.springframework=debug spring.flyway.enabled=false +spring.docker.compose.enabled=false + #spring.jpa.properties.jakarta.persistence.schema-generation.scripts.action=drop-and-create #spring.jpa.properties.jakarta.persistence.schema-generation.scripts.create-source=metadata #spring.jpa.properties.jakarta.persistence.schema-generation.scripts.drop-target=drop-and-create.sql From 8a16cb611dc295dd0e86153fd04679bdcd256f00 Mon Sep 17 00:00:00 2001 From: teooi Date: Sat, 29 Mar 2025 10:51:51 +0700 Subject: [PATCH 109/114] [teooi][2025-03-29] beer csv data --- src/main/resources/application-localmysql.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties index 74841e13a..6b123f93b 100644 --- a/src/main/resources/application-localmysql.properties +++ b/src/main/resources/application-localmysql.properties @@ -1,5 +1,5 @@ -spring.datasource.username=restadmin -spring.datasource.password=password +spring.datasource.username=root +spring.datasource.password=root spring.datasource.url=jdbc:mysql://127.0.0.1:3306/restdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.jpa.database=mysql spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver From b9b00e3e90d56297d1c81fc80d0b41e3a6323686 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 9 Oct 2022 12:01:46 -0400 Subject: [PATCH 110/114] adding csv pojo --- .../spring6restmvc/model/BeerCSVRecord.java | 29 +++++++++++++++++++ src/main/resources/csvdata/beers.csv | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/main/java/guru/springframework/spring6restmvc/model/BeerCSVRecord.java diff --git a/src/main/java/guru/springframework/spring6restmvc/model/BeerCSVRecord.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerCSVRecord.java new file mode 100644 index 000000000..50629186f --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerCSVRecord.java @@ -0,0 +1,29 @@ +package guru.springframework.spring6restmvc.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Created by jt, Spring Framework Guru. + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BeerCSVRecord { + private Integer row; + private Integer count; + private String abv; + private String ibu; + private Integer id; + private String beer; + private String style; + private Integer breweryId; + private Float ounces; + private String style2; + private String count_y; + private String city; + private String state; + private String label; + +} diff --git a/src/main/resources/csvdata/beers.csv b/src/main/resources/csvdata/beers.csv index 0eee91f05..cee9bda7c 100644 --- a/src/main/resources/csvdata/beers.csv +++ b/src/main/resources/csvdata/beers.csv @@ -1,4 +1,4 @@ -"","count.x","abv","ibu","id","beer","style","brewery_id","ounces","style2","count.y","brewery","city","state","label" +"row","count.x","abv","ibu","id","beer","style","brewery_id","ounces","style2","count.y","brewery","city","state","label" "1",1,0.05,NA,1436,"Pub Beer","American Pale Lager",408,12,NA,409,"10 Barrel Brewing Company","Bend","OR","Pub Beer (10 Barrel Brewing Company)" "2",2,0.066,NA,2265,"Devil's Cup","American Pale Ale (APA)",177,12,"American Pale Ale (APA)",178,"18th Street Brewery","Gary","IN","Devil's Cup (18th Street Brewery)" "3",3,0.071,NA,2264,"Rise of the Phoenix","American IPA",177,12,"American IPA",178,"18th Street Brewery","Gary","IN","Rise of the Phoenix (18th Street Brewery)" From c62ce8f22fd0b7c88b2af151f1a06e9ac8f54e56 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 9 Oct 2022 12:54:52 -0400 Subject: [PATCH 111/114] adding maven dep, initial OpenCSV mapping --- pom.xml | 5 ++++ .../spring6restmvc/model/BeerCSVRecord.java | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/pom.xml b/pom.xml index 763802622..722501c1d 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,11 @@ mapstruct ${org.mapstruct.version} + + com.opencsv + opencsv + 5.7.0 + org.springframework.boot spring-boot-docker-compose diff --git a/src/main/java/guru/springframework/spring6restmvc/model/BeerCSVRecord.java b/src/main/java/guru/springframework/spring6restmvc/model/BeerCSVRecord.java index 50629186f..143020d5b 100644 --- a/src/main/java/guru/springframework/spring6restmvc/model/BeerCSVRecord.java +++ b/src/main/java/guru/springframework/spring6restmvc/model/BeerCSVRecord.java @@ -1,5 +1,6 @@ package guru.springframework.spring6restmvc.model; +import com.opencsv.bean.CsvBindByName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -11,19 +12,47 @@ @NoArgsConstructor @AllArgsConstructor public class BeerCSVRecord { + + @CsvBindByName private Integer row; + + @CsvBindByName(column = "count.x") private Integer count; + + @CsvBindByName private String abv; + + @CsvBindByName private String ibu; + + @CsvBindByName private Integer id; + + @CsvBindByName private String beer; + + @CsvBindByName private String style; + + @CsvBindByName(column = "brewery_id") private Integer breweryId; + + @CsvBindByName private Float ounces; + + @CsvBindByName private String style2; + + @CsvBindByName(column = "count.y") private String count_y; + + @CsvBindByName private String city; + + @CsvBindByName private String state; + + @CsvBindByName private String label; } From 60f889edc527317d46640dc688a341a2456aab82 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Thu, 2 May 2024 16:29:05 -0400 Subject: [PATCH 112/114] update opencsv version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 722501c1d..701313c7b 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ com.opencsv opencsv - 5.7.0 + 5.9 org.springframework.boot From 07d33a2ef2b25f9e6f340cc6a36bc0767023ddab Mon Sep 17 00:00:00 2001 From: teooi Date: Sat, 29 Mar 2025 16:58:28 +0700 Subject: [PATCH 113/114] [phucpn1][2025-03-29] Done CSV Data --- .../bootstrap/BootstrapData.java | 43 +++++++++++++++++++ .../spring6restmvc/entities/Beer.java | 6 +++ .../services/BeerCsvService.java | 13 ++++++ .../services/BeerCsvServiceImpl.java | 30 +++++++++++++ .../application-localmysql.properties | 2 +- .../bootstrap/BootstrapDataTest.java | 11 ++++- .../controller/BeerControllerIT.java | 2 +- .../services/BeerCsvServiceImplTest.java | 30 +++++++++++++ 8 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/BeerCsvService.java create mode 100644 src/main/java/guru/springframework/spring6restmvc/services/BeerCsvServiceImpl.java create mode 100644 src/test/java/guru/springframework/spring6restmvc/services/BeerCsvServiceImplTest.java diff --git a/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java b/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java index 0856801c0..8f93ad35f 100644 --- a/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java +++ b/src/main/java/guru/springframework/spring6restmvc/bootstrap/BootstrapData.java @@ -2,16 +2,24 @@ import guru.springframework.spring6restmvc.entities.Beer; import guru.springframework.spring6restmvc.entities.Customer; +import guru.springframework.spring6restmvc.model.BeerCSVRecord; import guru.springframework.spring6restmvc.model.BeerStyle; import guru.springframework.spring6restmvc.repositories.BeerRepository; import guru.springframework.spring6restmvc.repositories.CustomerRepository; +import guru.springframework.spring6restmvc.services.BeerCsvService; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ResourceUtils; +import java.io.File; +import java.io.FileNotFoundException; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; +import java.util.List; /** * Created by jt, Spring Framework Guru. @@ -21,13 +29,48 @@ public class BootstrapData implements CommandLineRunner { private final BeerRepository beerRepository; private final CustomerRepository customerRepository; + private final BeerCsvService beerCsvService; + @Transactional @Override public void run(String... args) throws Exception { loadBeerData(); + loadCsvData(); loadCustomerData(); } + private void loadCsvData() throws FileNotFoundException { + long count = beerRepository.count(); + if (count < 10) { + File file = ResourceUtils.getFile("classpath:csvdata/beers.csv"); + + List recs = beerCsvService.convertCSV(file); + + recs.forEach(beerCSVRecord -> { + BeerStyle beerStyle = switch (beerCSVRecord.getStyle()) { + case "American Pale Lager" -> BeerStyle.LAGER; + case "American Pale Ale (APA)", "American Black Ale", "Belgian Dark Ale", "American Blonde Ale" -> + BeerStyle.ALE; + case "American IPA", "American Double / Imperial IPA", "Belgian IPA" -> BeerStyle.IPA; + case "American Porter" -> BeerStyle.PORTER; + case "Oatmeal Stout", "American Stout" -> BeerStyle.STOUT; + case "Saison / Farmhouse Ale" -> BeerStyle.SAISON; + case "Fruit / Vegetable Beer", "Winter Warmer", "Berliner Weissbier" -> BeerStyle.WHEAT; + case "English Pale Ale" -> BeerStyle.PALE_ALE; + default -> BeerStyle.PILSNER; + }; + + beerRepository.save(Beer.builder() + .beerName(StringUtils.abbreviate(beerCSVRecord.getBeer(), 50)) + .beerStyle(beerStyle) + .price(BigDecimal.TEN) + .upc(beerCSVRecord.getRow().toString()) + .quantityOnHand(beerCSVRecord.getCount()) + .build()); + }); + } + } + private void loadBeerData() { if (beerRepository.count() == 0){ Beer beer1 = Beer.builder() diff --git a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java index a4b9f8d81..0c713be14 100644 --- a/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java +++ b/src/main/java/guru/springframework/spring6restmvc/entities/Beer.java @@ -6,7 +6,9 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import lombok.*; +import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.UpdateTimestamp; import org.hibernate.annotations.UuidGenerator; import org.hibernate.type.SqlTypes; @@ -53,6 +55,10 @@ public class Beer { @NotNull private BigDecimal price; + + @CreationTimestamp private LocalDateTime createdDate; + + @UpdateTimestamp private LocalDateTime updateDate; } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerCsvService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerCsvService.java new file mode 100644 index 000000000..4983e723c --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerCsvService.java @@ -0,0 +1,13 @@ +package guru.springframework.spring6restmvc.services; + +import guru.springframework.spring6restmvc.model.BeerCSVRecord; + +import java.io.File; +import java.util.List; + +/** + * Created by pn1 + */ +public interface BeerCsvService { + List convertCSV(File csvFile); +} diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerCsvServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerCsvServiceImpl.java new file mode 100644 index 000000000..ff637eba3 --- /dev/null +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerCsvServiceImpl.java @@ -0,0 +1,30 @@ +package guru.springframework.spring6restmvc.services; + +import com.opencsv.bean.CsvToBeanBuilder; +import guru.springframework.spring6restmvc.model.BeerCSVRecord; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by pn1 + */ +@Service +public class BeerCsvServiceImpl implements BeerCsvService { + @Override + public List convertCSV(File csvFile) { + + try { + List beerCSVRecords = new CsvToBeanBuilder(new FileReader(csvFile)) + .withType(BeerCSVRecord.class) + .build().parse(); + return beerCSVRecords; + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/resources/application-localmysql.properties b/src/main/resources/application-localmysql.properties index 6b123f93b..cc82aec18 100644 --- a/src/main/resources/application-localmysql.properties +++ b/src/main/resources/application-localmysql.properties @@ -6,7 +6,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=validate spring.flyway.enabled=true -spring.docker.compose.enabled=true +spring.docker.compose.enabled=false spring.datasource.hikari.pool-name=RestDB-Pool spring.datasource.hikari.maximum-pool-size=5 diff --git a/src/test/java/guru/springframework/spring6restmvc/bootstrap/BootstrapDataTest.java b/src/test/java/guru/springframework/spring6restmvc/bootstrap/BootstrapDataTest.java index a812d628d..ab6fbca95 100644 --- a/src/test/java/guru/springframework/spring6restmvc/bootstrap/BootstrapDataTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/bootstrap/BootstrapDataTest.java @@ -2,14 +2,18 @@ import guru.springframework.spring6restmvc.repositories.BeerRepository; import guru.springframework.spring6restmvc.repositories.CustomerRepository; +import guru.springframework.spring6restmvc.services.BeerCsvService; +import guru.springframework.spring6restmvc.services.BeerCsvServiceImpl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; import static org.assertj.core.api.Assertions.assertThat; @DataJpaTest +@Import(BeerCsvServiceImpl.class) class BootstrapDataTest { @Autowired @@ -18,18 +22,21 @@ class BootstrapDataTest { @Autowired CustomerRepository customerRepository; + @Autowired + BeerCsvService csvService; + BootstrapData bootstrapData; @BeforeEach void setUp() { - bootstrapData = new BootstrapData(beerRepository, customerRepository); + bootstrapData = new BootstrapData(beerRepository, customerRepository, csvService); } @Test void Testrun() throws Exception { bootstrapData.run(null); - assertThat(beerRepository.count()).isEqualTo(3); + assertThat(beerRepository.count()).isEqualTo(2413); assertThat(customerRepository.count()).isEqualTo(3); } } diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index edce2b8a8..fd1ff4ac8 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -151,7 +151,7 @@ void testGetById() { void testListBeers() { List dtos = beerController.listBeers(); - assertThat(dtos.size()).isEqualTo(3); + assertThat(dtos.size()).isEqualTo(2413); } @Rollback diff --git a/src/test/java/guru/springframework/spring6restmvc/services/BeerCsvServiceImplTest.java b/src/test/java/guru/springframework/spring6restmvc/services/BeerCsvServiceImplTest.java new file mode 100644 index 000000000..0b15795ea --- /dev/null +++ b/src/test/java/guru/springframework/spring6restmvc/services/BeerCsvServiceImplTest.java @@ -0,0 +1,30 @@ +package guru.springframework.spring6restmvc.services; + +import guru.springframework.spring6restmvc.model.BeerCSVRecord; +import org.junit.jupiter.api.Test; +import org.springframework.util.ResourceUtils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class BeerCsvServiceImplTest { + + BeerCsvService beerCsvService = new BeerCsvServiceImpl(); + + + @Test + void convertCSV() throws FileNotFoundException { + + File file = ResourceUtils.getFile("classpath:csvdata/beers.csv"); + + List records = beerCsvService.convertCSV(file); + + System.out.println(records.size()); + + assertThat(records.size()).isGreaterThan(0); + } +} \ No newline at end of file From 911a629f035615b1aa4ed57edfbefdb289f67164 Mon Sep 17 00:00:00 2001 From: teooi Date: Sun, 30 Mar 2025 13:30:26 +0700 Subject: [PATCH 114/114] [phucpn1][2025-03-30] Done Paging and Sorting with Spring MVC --- .../controller/BeerController.java | 11 ++- .../repositories/BeerRepository.java | 9 +++ .../spring6restmvc/services/BeerService.java | 5 +- .../services/BeerServiceImpl.java | 6 +- .../services/BeerServiceJPA.java | 75 +++++++++++++++-- .../controller/BeerControllerIT.java | 81 +++++++++++++++++-- .../controller/BeerControllerTest.java | 20 ++--- .../repositories/BeerRepositoryTest.java | 13 +++ 8 files changed, 192 insertions(+), 28 deletions(-) diff --git a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java index 33d7faf2f..272c82bc9 100644 --- a/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java +++ b/src/main/java/guru/springframework/spring6restmvc/controller/BeerController.java @@ -1,16 +1,17 @@ package guru.springframework.spring6restmvc.controller; import guru.springframework.spring6restmvc.model.BeerDTO; +import guru.springframework.spring6restmvc.model.BeerStyle; import guru.springframework.spring6restmvc.services.BeerService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; import java.util.UUID; /** @@ -66,8 +67,12 @@ public ResponseEntity handlePost(@Validated @RequestBody BeerDTO beer){ } @GetMapping(value = BEER_PATH) - public List listBeers(){ - return beerService.listBeers(); + public Page listBeers(@RequestParam(required = false) String beerName, + @RequestParam(required = false) BeerStyle beerStyle, + @RequestParam(required = false) Boolean showInventory, + @RequestParam(required = false) Integer pageNumber, + @RequestParam(required = false) Integer pageSize){ + return beerService.listBeers(beerName, beerStyle, showInventory, pageNumber, pageSize); } diff --git a/src/main/java/guru/springframework/spring6restmvc/repositories/BeerRepository.java b/src/main/java/guru/springframework/spring6restmvc/repositories/BeerRepository.java index 314771a4a..76693572b 100644 --- a/src/main/java/guru/springframework/spring6restmvc/repositories/BeerRepository.java +++ b/src/main/java/guru/springframework/spring6restmvc/repositories/BeerRepository.java @@ -1,6 +1,9 @@ package guru.springframework.spring6restmvc.repositories; import guru.springframework.spring6restmvc.entities.Beer; +import guru.springframework.spring6restmvc.model.BeerStyle; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; @@ -9,4 +12,10 @@ * Created by jt, Spring Framework Guru. */ public interface BeerRepository extends JpaRepository { + + Page findAllByBeerNameIsLikeIgnoreCase(String beerName, Pageable pageable); + + Page findByBeerStyle(BeerStyle beerStyle, Pageable pageable); + + Page findByBeerNameIsLikeIgnoreCaseAndBeerStyle(String beerName, BeerStyle beerStyle, Pageable pageable); } diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java index 3f795410e..3caf760a5 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerService.java @@ -1,8 +1,9 @@ package guru.springframework.spring6restmvc.services; import guru.springframework.spring6restmvc.model.BeerDTO; +import guru.springframework.spring6restmvc.model.BeerStyle; +import org.springframework.data.domain.Page; -import java.util.List; import java.util.Optional; import java.util.UUID; @@ -11,7 +12,7 @@ */ public interface BeerService { - List listBeers(); + Page listBeers(String beerName, BeerStyle beerStyle, Boolean showInventory, Integer pageNumber, Integer pageSize); Optional getBeerById(UUID id); diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java index 7e0e1c047..6d6e99618 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceImpl.java @@ -3,6 +3,8 @@ import guru.springframework.spring6restmvc.model.BeerDTO; import guru.springframework.spring6restmvc.model.BeerStyle; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -108,8 +110,8 @@ public Optional updateBeerById(UUID beerId, BeerDTO beer) { } @Override - public List listBeers(){ - return new ArrayList<>(beerMap.values()); + public Page listBeers(String beerName, BeerStyle beerStyle, Boolean showInventory, Integer pageNumber, Integer pageSize){ + return new PageImpl<>(new ArrayList<>(beerMap.values())); } @Override diff --git a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java index 8e675a298..d8c478add 100644 --- a/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java +++ b/src/main/java/guru/springframework/spring6restmvc/services/BeerServiceJPA.java @@ -1,10 +1,16 @@ package guru.springframework.spring6restmvc.services; +import guru.springframework.spring6restmvc.entities.Beer; import guru.springframework.spring6restmvc.mappers.BeerMapper; import guru.springframework.spring6restmvc.model.BeerDTO; +import guru.springframework.spring6restmvc.model.BeerStyle; import guru.springframework.spring6restmvc.repositories.BeerRepository; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Primary; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -24,12 +30,71 @@ public class BeerServiceJPA implements BeerService { private final BeerRepository beerRepository; private final BeerMapper beerMapper; + private static final int DEFAULT_PAGE = 0; + private static final int DEFAULT_PAGE_SIZE = 25; + @Override - public List listBeers() { - return beerRepository.findAll() - .stream() - .map(beerMapper::beerToBeerDto) - .collect(Collectors.toList()); + public Page listBeers(String beerName, BeerStyle beerStyle, Boolean showInventory, Integer pageNumber, Integer pageSize) { + + PageRequest pageRequest = buildPageRequest(pageNumber, pageSize); + + Page beerPage; + + if(StringUtils.hasText(beerName) && beerStyle == null){ + beerPage = listBeersByName(beerName, pageRequest); + } + else if(!StringUtils.hasText(beerName) && beerStyle != null){ + beerPage = listBeersByStyle(beerStyle, pageRequest); + } + else if(StringUtils.hasText(beerName) && beerStyle != null){ + beerPage = listBeersByNameAndStyle(beerName, beerStyle, pageRequest); + } + else{ + beerPage = beerRepository.findAll(pageRequest); + } + + if(showInventory != null && !showInventory){ + beerPage.forEach(beer -> beer.setQuantityOnHand(null)); + } + + return beerPage.map(beerMapper::beerToBeerDto); + } + + public PageRequest buildPageRequest(Integer pageNumber, Integer pageSize){ + int queryPageNumber; + int queryPageSize; + + if (pageNumber != null && pageNumber > 0) { + queryPageNumber = pageNumber - 1; + } else { + queryPageNumber = DEFAULT_PAGE; + } + + if (pageSize == null) { + queryPageSize = DEFAULT_PAGE_SIZE; + } else { + if (pageSize > 1000){ + queryPageSize = 1000; + } else { + queryPageSize = pageSize; + } + } + + Sort sort = Sort.by(Sort.Order.asc("beerName")); + + return PageRequest.of(queryPageNumber, queryPageSize, sort); + } + + private Page listBeersByNameAndStyle(String beerName, BeerStyle beerStyle, Pageable pageable) { + return beerRepository.findByBeerNameIsLikeIgnoreCaseAndBeerStyle("%" + beerName + "%", beerStyle, pageable); + } + + public Page listBeersByStyle(BeerStyle beerStyle, Pageable pageable) { + return beerRepository.findByBeerStyle(beerStyle, pageable); + } + + public Page listBeersByName(String beerName, Pageable pageable) { + return beerRepository.findAllByBeerNameIsLikeIgnoreCase("%" + beerName + "%", pageable); } @Override diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java index fd1ff4ac8..a6e5ab023 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerIT.java @@ -4,11 +4,14 @@ import guru.springframework.spring6restmvc.entities.Beer; import guru.springframework.spring6restmvc.mappers.BeerMapper; import guru.springframework.spring6restmvc.model.BeerDTO; +import guru.springframework.spring6restmvc.model.BeerStyle; import guru.springframework.spring6restmvc.repositories.BeerRepository; +import org.hamcrest.core.IsNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -19,13 +22,14 @@ import org.springframework.web.context.WebApplicationContext; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @@ -52,6 +56,71 @@ void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); } + @Test + void testListBeersByStyleAndNameShowInventoryTruePage2() throws Exception { + mockMvc.perform(get(BeerController.BEER_PATH) + .queryParam("beerName", "IPA") + .queryParam("beerStyle", BeerStyle.IPA.name()) + .queryParam("showInventory", "true") + .queryParam("pageNumber", "2") + .queryParam("pageSize", "50")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content.size()").value(50)) + .andExpect(jsonPath("$.content.[0].quantityOnHand").value(IsNull.notNullValue())); + } + + @Test + void testListBeersByStyleAndNameShowInventoryTrue() throws Exception { + mockMvc.perform(get(BeerController.BEER_PATH) + .queryParam("beerName", "IPA") + .queryParam("beerStyle", BeerStyle.IPA.name()) + .queryParam("showInventory", "true") + .queryParam("pageSize", "800")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content.size()").value(310)) + .andExpect(jsonPath("$.content.[0].quantityOnHand").value(IsNull.notNullValue())); + } + + @Test + void testListBeersByStyleAndNameShowInventoryFalse() throws Exception { + mockMvc.perform(get(BeerController.BEER_PATH) + .queryParam("beerName", "IPA") + .queryParam("beerStyle", BeerStyle.IPA.name()) + .queryParam("showInventory", "false") + .queryParam("pageSize", "800")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content.size()").value(310)) + .andExpect(jsonPath("$.content.[0].quantityOnHand").value(IsNull.nullValue())); + } + + @Test + void testListBeersByStyleAndName() throws Exception { + mockMvc.perform(get(BeerController.BEER_PATH) + .queryParam("beerName", "IPA") + .queryParam("beerStyle", BeerStyle.IPA.name()) + .queryParam("pageSize", "800")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content.size()").value(310)); + } + + @Test + void testListBeersByStyle() throws Exception { + mockMvc.perform(get(BeerController.BEER_PATH) + .queryParam("beerStyle", BeerStyle.IPA.name()) + .queryParam("pageSize", "800")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content.size()").value(548)); + } + + @Test + void testListBeersByName() throws Exception { + mockMvc.perform(get(BeerController.BEER_PATH) + .queryParam("beerName", "IPA") + .queryParam("pageSize", "800")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content.size()").value(336)); + } + @Test void testPatchBeerBadName() throws Exception { Beer beer = beerRepository.findAll().get(0); @@ -140,7 +209,7 @@ void testBeerIdNotFound() { @Test void testGetById() { - Beer beer = beerRepository.findAll().get(0); + Beer beer = beerRepository.findAll().getFirst(); BeerDTO dto = beerController.getBeerById(beer.getId()); @@ -149,9 +218,9 @@ void testGetById() { @Test void testListBeers() { - List dtos = beerController.listBeers(); + Page page = beerController.listBeers(null, null, false, 1, 2413); - assertThat(dtos.size()).isEqualTo(2413); + assertThat(page.getContent().size()).isEqualTo(1000); } @Rollback @@ -159,9 +228,9 @@ void testListBeers() { @Test void testEmptyList() { beerRepository.deleteAll(); - List dtos = beerController.listBeers(); + Page page = beerController.listBeers(null, null, false, 1, 25); - assertThat(dtos.size()).isEqualTo(0); + assertThat(page.getContent().size()).isEqualTo(0); } } diff --git a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java index d5e9feba4..42f71d002 100644 --- a/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/controller/BeerControllerTest.java @@ -55,7 +55,7 @@ void setUp() { @Test void testPatchBeer() throws Exception { - BeerDTO beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers(null, null, false, 1, 25).getContent().getFirst(); Map beerMap = new HashMap<>(); beerMap.put("beerName", "New Name"); @@ -74,7 +74,7 @@ void testPatchBeer() throws Exception { @Test void testDeleteBeer() throws Exception { - BeerDTO beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers(null, null, false, 1, 25).getContent().getFirst(); given(beerService.deleteById(any())).willReturn(true); @@ -89,7 +89,7 @@ void testDeleteBeer() throws Exception { @Test void testUpdateBeer() throws Exception { - BeerDTO beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers(null, null, false, 1, 25).getContent().getFirst(); given(beerService.updateBeerById(any(), any())).willReturn(Optional.of(beer)); @@ -104,7 +104,7 @@ void testUpdateBeer() throws Exception { @Test void testUpdateBeerBlankName() throws Exception { - BeerDTO beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers(null, null, false, 1, 25).getContent().getFirst(); beer.setBeerName(""); given(beerService.updateBeerById(any(), any())).willReturn(Optional.of(beer)); @@ -119,11 +119,11 @@ void testUpdateBeerBlankName() throws Exception { @Test void testCreateNewBeer() throws Exception { - BeerDTO beer = beerServiceImpl.listBeers().get(0); + BeerDTO beer = beerServiceImpl.listBeers(null, null, false, 1, 25).getContent().getFirst(); beer.setVersion(null); beer.setId(null); - given(beerService.saveNewBeer(any(BeerDTO.class))).willReturn(beerServiceImpl.listBeers().get(1)); + given(beerService.saveNewBeer(any(BeerDTO.class))).willReturn(beerServiceImpl.listBeers(null, null, false, 1, 25).getContent().get(1)); mockMvc.perform(post(BeerController.BEER_PATH) .accept(MediaType.APPLICATION_JSON) @@ -138,7 +138,7 @@ void testCreateBeerNullBeerName() throws Exception { BeerDTO beerDTO = BeerDTO.builder().build(); - given(beerService.saveNewBeer(any(BeerDTO.class))).willReturn(beerServiceImpl.listBeers().get(1)); + given(beerService.saveNewBeer(any(BeerDTO.class))).willReturn(beerServiceImpl.listBeers(null, null, false, 1, 25).getContent().get(1)); MvcResult mvcResult = mockMvc.perform(post(BeerController.BEER_PATH) .accept(MediaType.APPLICATION_JSON) @@ -153,13 +153,13 @@ void testCreateBeerNullBeerName() throws Exception { @Test void testListBeers() throws Exception { - given(beerService.listBeers()).willReturn(beerServiceImpl.listBeers()); + given(beerService.listBeers(any(), any(), any(), any(), any())).willReturn(beerServiceImpl.listBeers(null, null, false, 1, 25)); mockMvc.perform(get(BeerController.BEER_PATH) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("$.length()", is(3))); + .andExpect(jsonPath("$.content.length()", is(3))); } @Test @@ -173,7 +173,7 @@ void getBeerByIdNotFound() throws Exception { @Test void getBeerById() throws Exception { - BeerDTO testBeer = beerServiceImpl.listBeers().get(0); + BeerDTO testBeer = beerServiceImpl.listBeers(null, null, false, 1, 25).getContent().getFirst(); given(beerService.getBeerById(testBeer.getId())).willReturn(Optional.of(testBeer)); diff --git a/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java b/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java index 1e8039427..4ecf24695 100644 --- a/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java +++ b/src/test/java/guru/springframework/spring6restmvc/repositories/BeerRepositoryTest.java @@ -1,23 +1,36 @@ package guru.springframework.spring6restmvc.repositories; +import guru.springframework.spring6restmvc.bootstrap.BootstrapData; import guru.springframework.spring6restmvc.entities.Beer; import guru.springframework.spring6restmvc.model.BeerStyle; +import guru.springframework.spring6restmvc.services.BeerCsvServiceImpl; import jakarta.validation.ConstraintViolationException; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; +import org.springframework.data.domain.Page; import java.math.BigDecimal; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; @DataJpaTest +@Import({BootstrapData.class, BeerCsvServiceImpl.class}) class BeerRepositoryTest { @Autowired BeerRepository beerRepository; + @Test + void testGetBeerListByName(){ + Page page = beerRepository.findAllByBeerNameIsLikeIgnoreCase("%IPA%", null); + + assertThat(page.getContent().size()).isEqualTo(336); + } + @Test void testSaveBeerNameTooLong() {