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 +4 -4
- data/README.md +2 -2
- data/build.gradle +1 -1
- data/src/main/scala/org/embulk/parser/twitter_ads_stats/Column.scala +2 -2
- data/src/main/scala/org/embulk/parser/twitter_ads_stats/SegmentJson.scala +16 -0
- data/src/main/scala/org/embulk/parser/twitter_ads_stats/TwitterAdsStatsParserPlugin.scala +2 -1
- data/src/main/scala/org/embulk/parser/twitter_ads_stats/define/IDData.scala +1 -1
- data/src/main/scala/org/embulk/parser/twitter_ads_stats/define/Request.scala +2 -1
- data/src/main/scala/org/embulk/parser/twitter_ads_stats/define/RootJson.scala +5 -4
- data/src/main/scala/org/embulk/parser/twitter_ads_stats/package.scala +1 -0
- data/src/test/scala/org/embulk/parser/twitter_ads_stats/ColumnSpec.scala +2 -2
- data/src/test/scala/org/embulk/parser/twitter_ads_stats/SegmentJsonSpec.scala +19 -0
- data/src/test/scala/org/embulk/parser/twitter_ads_stats/define/ParamsSpec.scala +2 -2
- data/src/test/scala/org/embulk/parser/twitter_ads_stats/define/RootSpec.scala +6 -3
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e69b0390b7c28349313aaebf2524b549ab16c9d6
|
4
|
+
data.tar.gz: bf8dd7e7a60dda0a5953e3010a1c0981e95aac4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 (
|
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 (
|
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}
|
data/build.gradle
CHANGED
@@ -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.
|
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[
|
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.
|
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[
|
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[
|
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
|
}
|
@@ -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.
|
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.
|
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-
|
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.
|
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
|