kril 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f29ebc51e511a7e37aee1e470e17656983b6a76a
4
- data.tar.gz: 694569edd72f95f312416fc130980c568eea2ed3
3
+ metadata.gz: dc5623bc2f2039f53fbfe78a9fdf24b9aa14ec73
4
+ data.tar.gz: 05fad289a66fa8886113ec829d1336ba956bc1e5
5
5
  SHA512:
6
- metadata.gz: 5f5ce6ac018415bbccca2ef13c158d1359b670133d1207bc77d0c961f19df1ae56d2a0016c01134e92263443f715aea0ab8b2cc7aba067269d287d8540838498
7
- data.tar.gz: 6f5848ff5d4bafb165bfed72ba235627f45ef45ab2a35d17a18907f30de7a476b15b39c7fd1230e0f68d90e194e53f00db42426e1a5dea115e4338db09537b29
6
+ metadata.gz: 43ad965f8c1c59a0210f80216e127bccc68e631fca4dd2feaf438c3550817ce3d4b377bf3941c50560e3ef830c1f158378e62e4ee7283f0d9b2b16f6106287de
7
+ data.tar.gz: b4025a0d14a3e16fa3000908627b8120244f9664064477f366d0779f7c9318bc5a03a751a336985caca32855296dfe85effd54c77337134fdade1caf076e5d3a
data/.gitignore CHANGED
@@ -7,4 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
- *.avsc
10
+ /schemas
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kril (0.1.4)
4
+ kril (0.1.5)
5
5
  avro_turf (~> 0.8.0)
6
6
  clamp (~> 1.2, >= 1.2.1)
7
7
  ruby-kafka (~> 0.5.3)
data/README.md CHANGED
@@ -73,7 +73,7 @@ $ kril --consume-all human
73
73
  🦐 human: {:key=>nil, :value=>{"age"=>27}, :offset=>0, :create_time=>2018-03-04 00:13:13 -0700, :topic=>"human", :partition=>0}
74
74
  ```
75
75
  ---
76
- The `--schema` flag is flexible:
76
+ The `--schema` option is flexible:
77
77
  ```bash
78
78
  $ kril --schema /path/to/schema.avsc
79
79
  $ kril --schema name_of_existing_schema
@@ -87,7 +87,14 @@ $ kril -s human -r '{"age":99}'
87
87
  ```bash
88
88
  🦐 human: {"age"=>99}
89
89
  ```
90
-
90
+ ---
91
+ To see what schemas are saved in the repository:
92
+ ```bash
93
+ $ kril --list-schemas
94
+ ```
95
+ ```bash
96
+ human, another_schema
97
+ ```
91
98
  ## Contributing
92
99
 
93
100
  1. Fork it ( https://github.com/ChadBowman/kril/fork )
@@ -96,7 +103,7 @@ $ kril -s human -r '{"age":99}'
96
103
  4. Push to the branch (`git push origin my-new-feature`)
97
104
  5. Create a new Pull Request
98
105
 
99
- Please try to obey 👮[Rubocop](https://github.com/bbatsov/rubocop) to the best of your abilities.
106
+ Obey 👮[Rubocop](https://github.com/bbatsov/rubocop)! 🚨
100
107
 
101
108
  ## License
102
109
 
data/bin/kril CHANGED
@@ -10,7 +10,7 @@ require 'kril'
10
10
  Clamp do
11
11
  $log = Logger.new($STDOUT)
12
12
  $log.level = Logger::ERROR
13
- gem_root = File.expand_path('..', __dir__)
13
+ $gem_root = File.expand_path('..', __dir__)
14
14
 
15
15
  option %w[--version], :flag, 'show version' do
16
16
  puts Kril::VERSION
@@ -23,7 +23,7 @@ Clamp do
23
23
  address_string.split(/,\s*/)
24
24
  end
25
25
  option %w[-g --schema-registry], '', 'address of schema registry', default: 'http://localhost:8081'
26
- option %w[-p --schemas-path], '', 'directory of Avro schemas', default: "#{File.join(gem_root, 'schemas')}" do |path|
26
+ option %w[-p --schemas-path], '', 'directory of Avro schemas', default: File.join($gem_root, 'schemas').to_s do |path|
27
27
  raise ArgumentError, "Schema path: #{path} is not a directory" unless File.directory?(path)
28
28
  end
29
29
  option %w[-v --verbose], :flag, 'print logs, warnings' do
@@ -36,11 +36,14 @@ Clamp do
36
36
  option %w[-r --record], '', 'record to commit to topic'
37
37
  option %w[-o --synchronous], :flag, 'commit records synchronously'
38
38
  option %w[-s --schema], '', 'schema name, path to schema, or schema contents'
39
- option %w[-j --extract-from-java-files], '', 'extract schemas from Avro generated java files'
39
+ option %w[-j --extract-schemas], '', 'extract schemas from Avro generated java files'
40
40
 
41
41
  # consuming
42
42
  option %w[-a --consume-all], :flag, 'consume every record on topic'
43
43
 
44
+ # utility
45
+ option %w[-l --list-schemas], :flag, 'list saved schemas'
46
+
44
47
  parameter '[TOPIC]', 'topic to produce to or consume from'
45
48
 
46
49
  def execute
@@ -52,7 +55,7 @@ Clamp do
52
55
  avro = AvroTurf::Messaging.new(registry: registry,
53
56
  schema_store: store,
54
57
  logger: $log)
55
- if extract_from_java_files
58
+ if extract_schemas
56
59
  Kril::SchemaExtractor.extract(source_dir: extract_from_java_files,
57
60
  output_dir: schemas_path)
58
61
  end
@@ -73,17 +76,22 @@ Clamp do
73
76
  rescue Kafka::ConnectionError => e
74
77
  print_error(e.message)
75
78
  end
79
+ if list_schemas?
80
+ schemas = File.join($gem_root, 'schemas', '**', '*.avsc')
81
+ puts Dir.glob(schemas).map { |file| File.basename(file, '.avsc') }.join(', ')
82
+ end
76
83
  end
77
84
 
78
85
  private
79
86
 
80
87
  def produce_record(kafka, avro, store)
81
88
  producer = Kril::Producer.new(kafka: kafka, avro: avro)
82
- schema_name = schema_name(store)
89
+ names = schema_name(store)
83
90
  record_as_json = JSON.parse(record)
84
- infered_topic = topic || schema_name
91
+ infered_topic = topic || names[:schema_name]
85
92
  producer.send(record: record_as_json,
86
- schema_name: schema_name,
93
+ schema_name: names[:schema_name],
94
+ namespace: names[:namespace],
87
95
  topic: infered_topic,
88
96
  syncronous: synchronous?)
89
97
  print_record(infered_topic, record_as_json)
@@ -101,7 +109,7 @@ Clamp do
101
109
  end
102
110
 
103
111
  def schema_name(schema_store)
104
- handler = Kril::SchemaHandler.new(schema_store: schema_store)
112
+ handler = Kril::SchemaHandler.new(schema_store: schema_store, schemas_path: schemas_path)
105
113
  handler.process(schema || topic)
106
114
  end
107
115
 
@@ -20,11 +20,18 @@ module Kril
20
20
  #
21
21
  # record - record to serialize and commit [String]
22
22
  # schema_name - name of schema to encode record from [String]
23
+ # namespace - namespace of schema (optional) [String]
23
24
  # topic - name of topic. Will be schema_name if nil (optional) [String]
24
25
  # synchronous - blocks until commit if true (optional) [Boolean]
25
- def send(record:, schema_name:, topic: nil, syncronous: false)
26
+ def send(record:,
27
+ schema_name:,
28
+ namespace: nil,
29
+ topic: nil,
30
+ syncronous: false)
26
31
  topic ||= schema_name
27
- encoded = @avro.encode(record, schema_name: schema_name)
32
+ encoded = @avro.encode(record,
33
+ schema_name: schema_name,
34
+ namespace: namespace)
28
35
  if syncronous
29
36
  @sync.produce(encoded, topic: topic)
30
37
  @sync.deliver_messages
@@ -5,7 +5,7 @@ module Kril
5
5
  class SchemaHandler
6
6
  # schemas_path - directory of schema repository [String]
7
7
  # schema_store - schema store [AvroTurf::SchemaStore]
8
- def initialize(schemas_path: nil,
8
+ def initialize(schemas_path:,
9
9
  schema_store: nil)
10
10
  schema_store ||= AvroTurf::SchemaStore.new(path: schemas_path)
11
11
  @schema_store = schema_store
@@ -15,21 +15,32 @@ module Kril
15
15
  # Handles input to reference or create schema.
16
16
  #
17
17
  # input_string - schema name, schema file, or schema contents [String]
18
- # returns - schema name [String]
18
+ # returns - schema name, namespace [Hash]
19
19
  def process(input_string)
20
20
  if File.exist?(input_string)
21
21
  copy_schema_to_store(input_string)
22
22
  elsif schema?(input_string)
23
23
  save_schema(input_string)
24
24
  else
25
- @schema_store.find(input_string).name
25
+ name, namespace = separate_fullname(input_string)
26
+ namespace = nil if namespace.empty?
27
+ schema = @schema_store.find(name, namespace)
28
+ {
29
+ schema_name: schema&.name,
30
+ namespace: schema&.namespace
31
+ }
26
32
  end
27
33
  end
28
34
 
29
35
  private
30
36
 
37
+ def separate_fullname(fullname)
38
+ arr = fullname.split('.')
39
+ [arr.pop, arr.join('.')]
40
+ end
41
+
31
42
  def schema?(input)
32
- JSON.parse(input)['name']
43
+ !JSON.parse(input)['name'].nil?
33
44
  rescue StandardError
34
45
  false
35
46
  end
@@ -37,18 +48,35 @@ module Kril
37
48
  def save_schema(schema)
38
49
  schema = JSON.parse(schema)
39
50
  schema_name = schema['name']
40
- path = File.join(@schemas_path, "#{schema_name}.avsc")
41
- File.open(path, 'w') { |file| file.write(JSON.pretty_generate(schema)) }
42
- schema_name
51
+ namespace = schema['namespace']
52
+ if namespace
53
+ path = File.join(@schemas_path, namespace.split('.'))
54
+ FileUtils.mkdir_p(path)
55
+ end
56
+ File.open(File.join(path || @schemas_path, "#{schema_name}.avsc"), 'w') do |file|
57
+ file.write(JSON.pretty_generate(schema))
58
+ end
59
+ {
60
+ schema_name: schema_name,
61
+ namespace: namespace
62
+ }
43
63
  end
44
64
 
45
65
  def copy_schema_to_store(path)
46
66
  schema = File.read(path)
47
67
  raise ArgumentError, "Not a valid schema: #{path}" unless schema?(schema)
48
- schema_name = JSON.parse(schema)['name']
49
- new_path = File.join(@schemas_path, "#{schema_name}.avsc")
50
- FileUtils.copy_file(path, new_path)
51
- schema_name
68
+ json = JSON.parse(schema)
69
+ schema_name = json['name']
70
+ namespace = json['namespace']
71
+ if namespace
72
+ schema_path = File.join(@schemas_path, namespace.split('.'))
73
+ FileUtils.mkdir_p(schema_path)
74
+ end
75
+ FileUtils.copy_file(path, File.join(schema_path || @schemas_path, "#{schema_name}.avsc"))
76
+ {
77
+ schema_name: schema_name,
78
+ namespace: namespace
79
+ }
52
80
  end
53
81
  end
54
82
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kril
4
- VERSION = '0.1.5'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kril
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chad Bowman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-05 00:00:00.000000000 Z
11
+ date: 2018-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro_turf