embulk-parser-twitter_ads_stats 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 93219dadb40ae3f94d32c5eddad58f1a8b4d94b6
4
- data.tar.gz: 5a204dfced19354a50327532c32aef666f0533dc
3
+ metadata.gz: e69b0390b7c28349313aaebf2524b549ab16c9d6
4
+ data.tar.gz: bf8dd7e7a60dda0a5953e3010a1c0981e95aac4e
5
5
  SHA512:
6
- metadata.gz: cc52f765282f057a53ea9c89a323c1614b8c4b96adffde596eb910a329bad316fa8f67c8462edbdc37ab0579b47c43d9c20d81bce70a849c1afc1f72f6284629
7
- data.tar.gz: a478b63c6530108db5a57a2c718a716189b17ef79b285b7239877b5a7d94b0d49641676dd8633cd661319168704f16d7d759191c193ff1706aa8e11465bda217
6
+ metadata.gz: b4b04c28a0e215d3a04c52ae8111f1a1ca41429f8363bf3048a5cadf655729453f32da3102e812034b6b105cc40ee0a4acb82f90d8a8e550254fa86995bc9649
7
+ data.tar.gz: efce4bd51917e7f461607ce8f22881b5514a44a2045c18d1738d57496a5bf155630b4ea9e63512d193c7300154edabb97ff44dd90b5c2ead638dd7182463b8b1
data/README.md CHANGED
@@ -43,7 +43,7 @@ in:
43
43
  *************************** 1 ***************************
44
44
  id (string) : xxxxx
45
45
  date (string) : 2017-08-20
46
- segment (string) :
46
+ segment ( json) :
47
47
  placement (string) : ALL_ON_TWITTER
48
48
  billing ( json) : {"billed_charge_local_micro":100000000000,"billed_engagements":100}
49
49
  engagement ( json) : {"likes":1,"engagements":1,"app_clicks":100,"clicks":100,"card_engagements":100,"qualified_impressions":null,"retweets":1,"impressions":1,"follows":1,"replies":1,"url_clicks":1}
@@ -54,7 +54,7 @@ mobile_conversion ( json) : {"mobile_conversion_rates_order_quantity":null,"mob
54
54
  *************************** 2 ***************************
55
55
  id (string) : xxxxx
56
56
  date (string) : 2017-08-21
57
- segment (string) :
57
+ segment ( json) : {"segment_name":"hoge","segment_value":"fuga"}
58
58
  placement (string) : ALL_ON_TWITTER
59
59
  billing ( json) : {"billed_charge_local_micro":200000000000,"billed_engagements":200}
60
60
  engagement ( json) : {"likes":2,"engagements":2,"app_clicks":200,"clicks":200,"card_engagements":200,"qualified_impressions":null,"retweets":2,"impressions":2,"follows":2,"replies":2,"url_clicks":2}
@@ -13,7 +13,7 @@ configurations {
13
13
  provided
14
14
  }
15
15
 
16
- version = "0.1.3"
16
+ version = "0.1.4"
17
17
 
18
18
  sourceCompatibility = 1.7
19
19
  targetCompatibility = 1.7
@@ -27,7 +27,7 @@ object Column {
27
27
  val baseColumns = Seq(
28
28
  new EmbulkColumn(0, "id", Types.STRING),
29
29
  new EmbulkColumn(1, "date", Types.STRING),
30
- new EmbulkColumn(2, "segment", Types.STRING),
30
+ new EmbulkColumn(2, "segment", Types.JSON),
31
31
  new EmbulkColumn(3, "placement", Types.STRING)
32
32
  )
33
33
 
@@ -43,7 +43,7 @@ object Column {
43
43
  case class Column(
44
44
  id: String,
45
45
  date: LocalDate,
46
- segment: Option[String],
46
+ segment: Option[Segment],
47
47
  placement: String,
48
48
  metricsGroup: Map[String, MetricsGroup]
49
49
  )
@@ -0,0 +1,16 @@
1
+ package org.embulk.parser.twitter_ads_stats
2
+
3
+ import spray.json.DefaultJsonProtocol._
4
+ import spray.json._
5
+
6
+ object SegmentJson {
7
+ implicit object SegmentJsonWriter extends RootJsonWriter[Segment] {
8
+
9
+ private def toJValue(element: String): JsValue = element.toJson
10
+
11
+ override def write(obj: Segment): JsValue = {
12
+ val jsFields = obj.map(v => (v._1, toJValue(v._2)))
13
+ JsObject(jsFields)
14
+ }
15
+ }
16
+ }
@@ -10,6 +10,7 @@ import spray.json.{pimpAny, pimpString}
10
10
  import scala.util.control.NonFatal
11
11
  import scala.collection.JavaConverters._
12
12
  import MetricsGroupJson._
13
+ import SegmentJson._
13
14
  import org.embulk.parser.twitter_ads_stats.define.{Root, RootJson}
14
15
 
15
16
  class TwitterAdsStatsParserPlugin extends ParserPlugin {
@@ -57,7 +58,7 @@ class TwitterAdsStatsParserPlugin extends ParserPlugin {
57
58
  case (Column(_, date, _, _, _), "date") =>
58
59
  pb.setString(embulkColumn, date.toString)
59
60
  case (Column(_, _, Some(segment), _, _), "segment") =>
60
- pb.setString(embulkColumn, segment)
61
+ pb.setJson(embulkColumn, jsonParser.parse(segment.toJson.compactPrint))
61
62
  case (Column(_, _, None, _, _), "segment") =>
62
63
  pb.setNull(embulkColumn)
63
64
  case (Column(_, _, _, placement, _), "placement") =>
@@ -4,7 +4,7 @@ import java.time.LocalDate
4
4
 
5
5
  import org.embulk.parser.twitter_ads_stats._
6
6
 
7
- case class IDData(metrics: Metrics, segment: Option[String]) {
7
+ case class IDData(metrics: Metrics, segment: Option[Segment]) {
8
8
  private def resolveColumn(
9
9
  id: String,
10
10
  metricElementNames: MetricElementNames,
@@ -13,7 +13,8 @@ object Request {
13
13
  case class Params(
14
14
  start_time: StatsDateTime,
15
15
  end_time: StatsDateTime,
16
- placement: String
16
+ placement: String,
17
+ segmentation_type: Option[String]
17
18
  ) {
18
19
  require(!start_time.isAfter(end_time))
19
20
  require(start_time.isSameOffsetTime(end_time))
@@ -1,6 +1,6 @@
1
1
  package org.embulk.parser.twitter_ads_stats.define
2
2
 
3
- import org.embulk.parser.twitter_ads_stats.{MetricElementNames, MetricTimeSeries}
3
+ import org.embulk.parser.twitter_ads_stats.{MetricElementNames, MetricTimeSeries, Segment}
4
4
  import spray.json.{DefaultJsonProtocol, DeserializationException, JsArray, JsString, JsValue, RootJsonReader}
5
5
 
6
6
  class RootJson(metricElementNames: MetricElementNames) extends DefaultJsonProtocol {
@@ -36,7 +36,7 @@ class RootJson(metricElementNames: MetricElementNames) extends DefaultJsonProtoc
36
36
  case Seq(a: JsValue, b) =>
37
37
  IDData(
38
38
  MetricsReader.read(a.asJsObject),
39
- b.convertTo[Option[String]]
39
+ b.convertTo[Option[Segment]]
40
40
  )
41
41
  case x => throw DeserializationException(msg = s"id_data can't deserialize json: $x", fieldNames = fieldNames)
42
42
  }
@@ -64,11 +64,12 @@ class RootJson(metricElementNames: MetricElementNames) extends DefaultJsonProtoc
64
64
  override def read(json: JsValue): Params = {
65
65
  val fieldNames = Params.fieldNames.toList
66
66
  json.asJsObject.getFields(fieldNames: _*) match {
67
- case Seq(JsString(a), JsString(b), c) =>
67
+ case Seq(JsString(a), JsString(b), c, segmentationType) =>
68
68
  Params(
69
69
  StatsDateTime(a),
70
70
  StatsDateTime(b),
71
- c.convertTo[String]
71
+ c.convertTo[String],
72
+ segmentationType.convertTo[Option[String]]
72
73
  )
73
74
  case x => throw DeserializationException(msg = s"params can't deserialize json: $x", fieldNames = fieldNames)
74
75
  }
@@ -3,6 +3,7 @@ package org.embulk.parser
3
3
  package object twitter_ads_stats {
4
4
  type MetricTimeSeries = Option[Vector[Long]]
5
5
  type MetricsGroup = Map[String, Option[Long]]
6
+ type Segment = Map[String, String]
6
7
 
7
8
  val metricElementNames = MetricElementNames(
8
9
  Map(
@@ -22,10 +22,10 @@ class ColumnSpec extends UnitSpec {
22
22
  val expected = Seq(
23
23
  new EmbulkColumn(0, "id", Types.STRING),
24
24
  new EmbulkColumn(1, "date", Types.STRING),
25
- new EmbulkColumn(2, "segment", Types.STRING),
25
+ new EmbulkColumn(2, "segment", Types.JSON),
26
26
  new EmbulkColumn(3, "placement", Types.STRING),
27
27
  new EmbulkColumn(4, "billing", Types.JSON),
28
- new EmbulkColumn(5, "video", Types.JSON),
28
+ new EmbulkColumn(5, "video", Types.JSON)
29
29
  )
30
30
 
31
31
  assert(actual == expected)
@@ -0,0 +1,19 @@
1
+ package org.embulk.parser.twitter_ads_stats
2
+
3
+ import spray.json.{pimpAny, JsObject, JsString}
4
+
5
+ class SegmentJsonSpec extends UnitSpec {
6
+ "json write" in {
7
+ import SegmentJson._
8
+
9
+ val v: Segment = Map("segment_name" -> "hoge", "segment_value" -> "fuga")
10
+
11
+ val actual = v.toJson
12
+
13
+ val expected = JsObject(
14
+ "segment_name" -> JsString("hoge"),
15
+ "segment_value" -> JsString("fuga")
16
+ )
17
+ assert(actual == expected)
18
+ }
19
+ }
@@ -6,7 +6,7 @@ import org.embulk.parser.twitter_ads_stats.UnitSpec
6
6
 
7
7
  class ParamsSpec extends UnitSpec {
8
8
  "開始日~(終了日-1)の日程を取得する" in {
9
- val period = Params(StatsDateTime("2016-12-31T15:00:00Z"), StatsDateTime("2017-01-03T15:00:00Z"), "")
9
+ val period = Params(StatsDateTime("2016-12-31T15:00:00Z"), StatsDateTime("2017-01-03T15:00:00Z"), "", None)
10
10
  val actual = period.targetDates
11
11
  val expected = List(
12
12
  LocalDate.of(2017, 1, 1),
@@ -16,7 +16,7 @@ class ParamsSpec extends UnitSpec {
16
16
  assert(actual == expected)
17
17
  }
18
18
  "開始日から終了日までの全日程は、開始日から終了日が同一な場合は同一な日程となる" in {
19
- val period = Params(StatsDateTime("2016-12-31T15:00:00Z"), StatsDateTime("2017-01-01T15:00:00Z"), "")
19
+ val period = Params(StatsDateTime("2016-12-31T15:00:00Z"), StatsDateTime("2017-01-01T15:00:00Z"), "", None)
20
20
  val actual = period.targetDates
21
21
  val expected = List(
22
22
  LocalDate.of(2017, 1, 1)
@@ -177,7 +177,8 @@ class RootSpec extends UnitSpec {
177
177
  params = Params(
178
178
  start_time = StatsDateTime("2017-01-01T01:01:01Z"),
179
179
  end_time = StatsDateTime("2017-01-04T01:01:01Z"),
180
- placement = ""
180
+ placement = "",
181
+ segmentation_type = None
181
182
  )
182
183
  )
183
184
  ).resolveColumns(metricElementNames)
@@ -203,7 +204,8 @@ class RootSpec extends UnitSpec {
203
204
  params = Params(
204
205
  start_time = StatsDateTime("2017-01-01T01:01:01Z"),
205
206
  end_time = StatsDateTime("2017-01-01T01:01:01Z"),
206
- placement = ""
207
+ placement = "",
208
+ segmentation_type = None
207
209
  )
208
210
  )
209
211
  ).resolveColumns(names)
@@ -267,7 +269,8 @@ object RootSpec {
267
269
  params = Params(
268
270
  start_time = StatsDateTime("2017-01-01T01:01:01Z"),
269
271
  end_time = StatsDateTime("2017-01-03T01:01:01Z"),
270
- placement = ""
272
+ placement = "",
273
+ segmentation_type = None
271
274
  )
272
275
  )
273
276
  )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-parser-twitter_ads_stats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - kimutyam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-18 00:00:00.000000000 Z
11
+ date: 2018-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -67,6 +67,7 @@ files:
67
67
  - src/main/scala/org/embulk/parser/twitter_ads_stats/MetricsGroupJson.scala
68
68
  - src/main/scala/org/embulk/parser/twitter_ads_stats/ParseException.scala
69
69
  - src/main/scala/org/embulk/parser/twitter_ads_stats/PluginTask.scala
70
+ - src/main/scala/org/embulk/parser/twitter_ads_stats/SegmentJson.scala
70
71
  - src/main/scala/org/embulk/parser/twitter_ads_stats/TwitterAdsStatsParserPlugin.scala
71
72
  - src/main/scala/org/embulk/parser/twitter_ads_stats/define/Data.scala
72
73
  - src/main/scala/org/embulk/parser/twitter_ads_stats/define/FieldNameUtil.scala
@@ -81,13 +82,14 @@ files:
81
82
  - src/test/scala/org/embulk/parser/twitter_ads_stats/ColumnSpec.scala
82
83
  - src/test/scala/org/embulk/parser/twitter_ads_stats/MetricElementNamesSpec.scala
83
84
  - src/test/scala/org/embulk/parser/twitter_ads_stats/MetricsGroupJsonSpec.scala
85
+ - src/test/scala/org/embulk/parser/twitter_ads_stats/SegmentJsonSpec.scala
84
86
  - src/test/scala/org/embulk/parser/twitter_ads_stats/UnitSpec.scala
85
87
  - src/test/scala/org/embulk/parser/twitter_ads_stats/define/MetricsJsonSpec.scala
86
88
  - src/test/scala/org/embulk/parser/twitter_ads_stats/define/ParamsSpec.scala
87
89
  - src/test/scala/org/embulk/parser/twitter_ads_stats/define/RootJsonSpec.scala
88
90
  - src/test/scala/org/embulk/parser/twitter_ads_stats/define/RootSpec.scala
89
91
  - src/test/scala/org/embulk/parser/twitter_ads_stats/define/StatsDateTimeSpec.scala
90
- - classpath/embulk-parser-twitter_ads_stats-0.1.3.jar
92
+ - classpath/embulk-parser-twitter_ads_stats-0.1.4.jar
91
93
  - classpath/scala-library-2.12.3.jar
92
94
  - classpath/spray-json_2.12-1.3.3.jar
93
95
  homepage: https://github.com/septeni-original/embulk-parser-twitter_ads_stats