kril 0.1.0 → 0.1.1

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: 67262e75da09ed28a54946538cbf0eede5714481
4
- data.tar.gz: d4b669b387aaf0595a28b13e94e1849b9e4ac73b
3
+ metadata.gz: 273fc08c6713ec195cd1ccb84a067a58f0feeda9
4
+ data.tar.gz: be5b4f46adbc6202f85a6eb2a99f613654813998
5
5
  SHA512:
6
- metadata.gz: b2cee45454b6442253c638ad1343eb08660ba82aebcaee08eec0ff971f23d4f53612b6dd0cd6a22f69958f61939cb368565f8525e4404abcda594ba25898af7a
7
- data.tar.gz: 894634f416909563340e97ff693401da9a3e2cfff9333a0c1c5166af745c47ce0815bde49b9db13277070dd549345f28dbe3ed327f1e61514b578b3e93904405
6
+ metadata.gz: 6149bb5ccb97c5c2052af671267703d90a91bc2c1604157213be09dea30035dd7ba3a29926b04c12fc6183d8b2527dbbc8afc5c6beb267291bda2e854a676ddf
7
+ data.tar.gz: 2ca0265144bcfda279602117da61876b9ed7d52061e316a89f49d8ab1d0906ead3f107849f173bd57f4750b32f5f780030393745ec5c406e8d3fa70644a30ec8
data/.gitignore CHANGED
@@ -7,4 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
- Gemfile.lock
10
+ schemas/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,79 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ kril (0.1.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ addressable (2.5.2)
10
+ public_suffix (>= 2.0.2, < 4.0)
11
+ avro (1.8.2)
12
+ multi_json
13
+ avro_turf (0.8.0)
14
+ avro (>= 1.7.7, < 1.9)
15
+ excon (~> 0.45)
16
+ clamp (1.2.1)
17
+ crack (0.4.3)
18
+ safe_yaml (~> 1.0.0)
19
+ diff-lcs (1.3)
20
+ excon (0.60.0)
21
+ hashdiff (0.3.7)
22
+ httparty (0.16.0)
23
+ multi_xml (>= 0.5.2)
24
+ multi_json (1.13.1)
25
+ multi_xml (0.6.0)
26
+ mustermann (1.0.2)
27
+ public_suffix (3.0.2)
28
+ rack (2.0.4)
29
+ rack-protection (2.0.1)
30
+ rack
31
+ rake (10.5.0)
32
+ rspec (3.7.0)
33
+ rspec-core (~> 3.7.0)
34
+ rspec-expectations (~> 3.7.0)
35
+ rspec-mocks (~> 3.7.0)
36
+ rspec-core (3.7.1)
37
+ rspec-support (~> 3.7.0)
38
+ rspec-expectations (3.7.0)
39
+ diff-lcs (>= 1.2.0, < 2.0)
40
+ rspec-support (~> 3.7.0)
41
+ rspec-mocks (3.7.0)
42
+ diff-lcs (>= 1.2.0, < 2.0)
43
+ rspec-support (~> 3.7.0)
44
+ rspec-nc (0.3.0)
45
+ rspec (>= 3)
46
+ terminal-notifier (>= 1.4)
47
+ rspec-support (3.7.1)
48
+ ruby-kafka (0.5.3)
49
+ safe_yaml (1.0.4)
50
+ sinatra (2.0.1)
51
+ mustermann (~> 1.0)
52
+ rack (~> 2.0)
53
+ rack-protection (= 2.0.1)
54
+ tilt (~> 2.0)
55
+ terminal-notifier (2.0.0)
56
+ tilt (2.0.8)
57
+ webmock (3.3.0)
58
+ addressable (>= 2.3.6)
59
+ crack (>= 0.3.2)
60
+ hashdiff
61
+
62
+ PLATFORMS
63
+ ruby
64
+
65
+ DEPENDENCIES
66
+ avro_turf (~> 0.8.0)
67
+ bundler (~> 1.16)
68
+ clamp (~> 1.2, >= 1.2.1)
69
+ httparty (~> 0.16.0)
70
+ kril!
71
+ rake (~> 10.0)
72
+ rspec (~> 3.7)
73
+ rspec-nc (~> 0.3.0)
74
+ ruby-kafka (~> 0.5.3)
75
+ sinatra (~> 2.0, >= 2.0.1)
76
+ webmock (~> 3.3)
77
+
78
+ BUNDLED WITH
79
+ 1.16.0
data/README.md CHANGED
@@ -26,12 +26,11 @@ Assuming your schema is not registered with the schema registry, and doesn't exi
26
26
  ```bash
27
27
  $ kril --bootstrap-servers 'localhost:9092,localhost:9093,localhost:9094' \
28
28
  --schema-registry 'http://localhost:8081' \
29
- --with-schema '{"type":"record","name":"human","fields":[{"name":"age","type":"int"}]}' \
29
+ --schema '{"type":"record","name":"human","fields":[{"name":"age","type":"int"}]}' \
30
30
  --record '{"age": 27}' \
31
31
  human
32
32
  ```
33
33
  ```bash
34
- 🦐 saved human: {"type"=>"record", "name"=>"human", "fields"=>[{"name"=>"age", "type"=>"int"}]}
35
34
  🦐 human: {"age"=>27}
36
35
  ```
37
36
 
@@ -53,7 +52,7 @@ $ kril --pretty-print human
53
52
  }
54
53
  ```
55
54
  ---
56
- Now that the schema exists, we can produce records simply:
55
+ Since the schema exists in our repository, we can produce records simply:
57
56
  ```bash
58
57
  $ kril -r '{"age": 33}' human
59
58
  ```
@@ -73,16 +72,31 @@ $ kril --consume-all human
73
72
  🦐 human: {:key=>nil, :value=>{"age"=>33}, :offset=>1, :create_time=>2018-03-04 00:34:07 -0700, :topic=>"human", :partition=>3}
74
73
  🦐 human: {:key=>nil, :value=>{"age"=>27}, :offset=>0, :create_time=>2018-03-04 00:13:13 -0700, :topic=>"human", :partition=>0}
75
74
  ```
75
+ ---
76
+ The `--schema` flag is flexible:
77
+ ```bash
78
+ $ kril --schema /path/to/schema.avsc
79
+ $ kril --schema name_of_existing_schema
80
+ $ kril --schema '{"type":"record","name":"human","fields":[{"name":"age","type":"int"}]}'
81
+ ```
82
+ ---
83
+ If no topic is given, the topic will be inferred from the schema name:
84
+ ```bash
85
+ $ kril -s human -r '{"age":99}'
86
+ ```
87
+ ```bash
88
+ 🦐 human: {"age"=>99}
89
+ ```
76
90
 
77
91
  ## Contributing
78
92
 
79
93
  1. Fork it ( https://github.com/ChadBowman/kril/fork )
80
- 2. Create your feature branch (git checkout -b my-new-feature)
81
- 3. Commit your changes (git commit -am 'add some feature')
82
- 4. Push to the branch (git push origin my-new-feature)
94
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
95
+ 3. Commit your changes (`git commit -am 'add some feature'`)
96
+ 4. Push to the branch (`git push origin my-new-feature`)
83
97
  5. Create a new Pull Request
84
98
 
85
- Please try to obey [Rubocop](https://github.com/bbatsov/rubocop) to the best of your abilities.
99
+ Please try to obey 👮[Rubocop](https://github.com/bbatsov/rubocop) to the best of your abilities.
86
100
 
87
101
  ## License
88
102
 
data/bin/kril CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
- $VERBOSE = ARGV.map { |arg| true if arg.match?(/-v|--verbose/) }.compact.first
3
+ $VERBOSE = nil
4
4
 
5
5
  require 'avro_turf/messaging'
6
6
  require 'kafka'
@@ -8,72 +8,108 @@ require 'clamp'
8
8
  require 'kril'
9
9
 
10
10
  Clamp do
11
- option %w[-k --bootstrap-servers], '', 'address(es) of kafka cluster',
11
+ $log = Logger.new($STDOUT)
12
+ $log.level = Logger::ERROR
13
+
14
+ option %w[--version], :flag, 'show version' do
15
+ puts Kril::VERSION
16
+ exit(0)
17
+ end
18
+
19
+ # configuration
20
+ option %w[-k --bootstrap-servers], '', 'address(es) of Kafka cluster',
12
21
  default: %w[localhost:9092 localhost:9093 localhost:9094] do |address_string|
13
22
  address_string.split(/,\s*/)
14
23
  end
15
- # configuration
16
24
  option %w[-g --schema-registry], '', 'address of schema registry', default: 'http://localhost:8081'
17
- option %w[-p --schemas-path], '', 'directory of avro schemas', default: 'schemas/'
18
- option %w[-v --verbose], :flag, 'print logs, warnings'
19
- option %w[-e --pretty-print], :flag, 'pretty print records', default: false
25
+ option %w[-p --schemas-path], '', 'directory of Avro schemas', default: 'schemas/' do |path|
26
+ raise ArgumentError, "Schema path: #{path} is not a directory" unless File.directory?(path)
27
+ end
28
+ option %w[-v --verbose], :flag, 'print logs, warnings' do
29
+ $log.level = Logger::DEBUG
30
+ $VERBOSE = true
31
+ end
32
+ option %w[-e --pretty-print], :flag, 'pretty print records'
20
33
 
21
34
  # producing
22
35
  option %w[-r --record], '', 'record to commit to topic'
23
- option %w[-o --syncronous], :flag, 'commit records syncronously', default: false
24
- option %w[-w --with-schema], '', 'add schema to respository'
36
+ option %w[-o --synchronous], :flag, 'commit records synchronously'
37
+ option %w[-s --schema], '', 'schema name, path to schema, or schema contents'
38
+ option %w[-j --extract-from-java-files], '', 'extract schemas from Avro generated java files'
25
39
 
26
40
  # consuming
27
- option %w[-f --follow], :flag, 'consume from topic indefinitely', defualt: false
28
- option %w[-a --consume-all], :flag, 'consume every record on topic', default: false
41
+ option %w[-a --consume-all], :flag, 'consume every record on topic'
29
42
 
30
- parameter 'TOPIC', 'topic to produce to or consume from'
31
- parameter '[NAME]', 'schema name'
43
+ parameter '[TOPIC]', 'topic to produce to or consume from'
32
44
 
33
45
  def execute
34
- if topic
35
- log = Logger.new($STDOUT)
36
- log.level = verbose? ? Logger::WARN : Logger::ERROR
37
- kafka = Kafka.new(bootstrap_servers, logger: log, client_id: 'kril')
38
- avro = AvroTurf::Messaging.new(registry_url: schema_registry,
39
- schemas_path: schemas_path,
40
- logger: log)
41
-
42
- if with_schema
43
- schema = JSON.parse(with_schema)
44
- schema_name = schema['name']
45
- path = File.join(schemas_path, "#{schema_name}.avsc")
46
- File.open(path, 'w') { |file| file.write(JSON.pretty_generate(schema)) }
47
- print_record("saved #{schema_name}", schema)
46
+ kafka = Kafka.new(bootstrap_servers, logger: $log, client_id: 'kril')
47
+ registry = AvroTurf::CachedConfluentSchemaRegistry.new(
48
+ AvroTurf::ConfluentSchemaRegistry.new(schema_registry, logger: $log)
49
+ )
50
+ store = AvroTurf::SchemaStore.new(path: schemas_path)
51
+ avro = AvroTurf::Messaging.new(registry: registry,
52
+ schema_store: store,
53
+ logger: $log)
54
+ if extract_from_java_files
55
+ Kril::SchemaExtractor.extract(source_dir: extract_from_java_files,
56
+ output_dir: schemas_path)
57
+ end
58
+ begin
59
+ if record && (schema || topic)
60
+ begin
61
+ produce_record(kafka, avro, store)
62
+ rescue AvroTurf::SchemaNotFoundError => e
63
+ print_error(e.message)
64
+ end
65
+ elsif topic
66
+ consume_records(kafka, avro) do |record|
67
+ print_record(topic, record)
68
+ end
48
69
  end
70
+ rescue Excon::Error::Socket
71
+ print_error('could not connect to schema registry')
72
+ rescue Kafka::ConnectionError => e
73
+ print_error(e.message)
74
+ end
75
+ end
49
76
 
50
- if record
51
- producer = Kril::Producer.new(kafka: kafka, avro: avro)
52
- rec = JSON.parse(record)
53
- producer.send(record: rec,
54
- schema_name: name || topic,
55
- topic: topic,
56
- syncronous: syncronous?)
57
- print_record(topic, rec)
58
- else
59
- consumer = Kril::Consumer.new(kafka: kafka, avro: avro)
60
- if consume_all?
61
- consumer.consume_all(topic) do |message|
62
- print_record(topic, message)
63
- end
64
- elsif follow?
65
- consumer.listen(topic) do |message|
66
- print_record(topic, message)
67
- end
68
- else
69
- print_record(topic, consumer.consume_one(topic))
70
- end
77
+ private
78
+
79
+ def produce_record(kafka, avro, store)
80
+ producer = Kril::Producer.new(kafka: kafka, avro: avro)
81
+ schema_name = schema_name(store)
82
+ record_as_json = JSON.parse(record)
83
+ infered_topic = topic || schema_name
84
+ producer.send(record: record_as_json,
85
+ schema_name: schema_name,
86
+ topic: infered_topic,
87
+ syncronous: synchronous?)
88
+ print_record(infered_topic, record_as_json)
89
+ end
90
+
91
+ def consume_records(kafka, avro)
92
+ consumer = Kril::Consumer.new(kafka: kafka, avro: avro)
93
+ if consume_all?
94
+ consumer.consume_all(topic) do |message|
95
+ yield message
71
96
  end
97
+ else
98
+ yield consumer.consume_one(topic)
72
99
  end
73
100
  end
74
101
 
102
+ def schema_name(schema_store)
103
+ handler = Kril::SchemaHandler.new(schema_store: schema_store)
104
+ handler.process(schema || topic)
105
+ end
106
+
75
107
  def print_record(topic, record)
76
108
  record = "\n#{JSON.pretty_generate(record)}" if pretty_print?
77
109
  puts "🦐 #{topic}: #{record}"
78
110
  end
111
+
112
+ def print_error(message)
113
+ puts "💥 #{message}"
114
+ end
79
115
  end
data/lib/kril/consumer.rb CHANGED
@@ -1,15 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kril
4
- # Consumers records from Kafka
4
+ # High level abstraction for consuming records from topics.
5
5
  class Consumer
6
+ # avro - Avro instance for deserializing records [AvroTurf::Messaging]
7
+ # kafka - Kafka instance for creating consumers [Kafka]
8
+ # config - consumer configuration (optional) [Hash]
6
9
  def initialize(avro: nil, kafka: nil, config: {})
7
- config[:group_id] ||= '🦐'
10
+ config[:group_id] ||= 'kril-consumer'
8
11
  @avro = avro
9
12
  @kafka = kafka
10
13
  @config = config
11
14
  end
12
15
 
16
+ # Consume a single record from any partition.
17
+ # Will block indefinitely if no record present.
18
+ #
19
+ # topic - topic to consume from [String]
20
+ # return - deserialized record [String]
13
21
  def consume_one(topic)
14
22
  consumer = build_consumer(topic, true, @config)
15
23
  msg = nil
@@ -24,6 +32,13 @@ module Kril
24
32
  consumer.stop
25
33
  end
26
34
 
35
+ # Consume all records from a topic. Each record will be yielded
36
+ # to block along with consumer instance. Will listen to topic
37
+ # after all records have been consumed.
38
+ #
39
+ # topic - topic to consume from [String]
40
+ # yields - record, consumer [String, Kafka::Consumer]
41
+ # return - [nil]
27
42
  def consume_all(topic)
28
43
  config = @config.clone
29
44
  config[:group_id] = SecureRandom.uuid
@@ -35,15 +50,6 @@ module Kril
35
50
  consumer.stop
36
51
  end
37
52
 
38
- def listen(topic)
39
- consumer = build_consumer(topic, false, @config)
40
- consumer.each_message do |message|
41
- yield decode(message), consumer
42
- end
43
- ensure
44
- consumer.stop
45
- end
46
-
47
53
  private
48
54
 
49
55
  def build_consumer(topic, start_from_beginning, config)
data/lib/kril/producer.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kril
4
- # Produces records to Kafka
4
+ # High level abstraction for producing records to topics.
5
5
  class Producer
6
+ # avro - Avro instance for deserializing records [AvroTurf::Messaging]
7
+ # kafka - Kafka instance for creating producers [Kafka]
8
+ # config - producer configuration (optional) [Hash]
6
9
  def initialize(avro: nil, kafka: nil, config: {})
7
10
  config[:required_acks] ||= 1
8
11
  config[:delivery_threshold] ||= 1
@@ -13,12 +16,18 @@ module Kril
13
16
  @sync = kafka.producer(sync_config)
14
17
  end
15
18
 
19
+ # Commit a record to a topic.
20
+ #
21
+ # record - record to serialize and commit [String]
22
+ # schema_name - name of schema to encode record from [String]
23
+ # topic - name of topic. Will be schema_name if nil (optional) [String]
24
+ # synchronous - blocks until commit if true (optional) [Boolean]
16
25
  def send(record:, schema_name:, topic: nil, syncronous: false)
17
26
  topic ||= schema_name
18
27
  encoded = @avro.encode(record, schema_name: schema_name)
19
28
  if syncronous
20
- @producer.produce(encoded, topic: topic)
21
- @producer.deliver_messages
29
+ @sync.produce(encoded, topic: topic)
30
+ @sync.deliver_messages
22
31
  else
23
32
  @async.produce(encoded, topic: topic)
24
33
  end
@@ -4,7 +4,7 @@ module Kril
4
4
  # Creates and validates a record based from a defined schema.
5
5
  class RecordBuilder
6
6
  def initialize(schema_file_name: nil,
7
- schemas_dir: 'schemas',
7
+ schemas_dir: 'schemas/',
8
8
  schema_path: nil)
9
9
  path = schema_path || File.join(schemas_dir, "#{schema_file_name}.avsc")
10
10
  file = File.read(path)
@@ -1,21 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kril
4
- # Extracts avro schemas from avro genrated java files.
5
- class SchemaExtractor
6
- def initialize(source_dir:, output_dir:)
7
- @source_dir = File.join(Dir.pwd, source_dir)
8
- @output_dir = File.join(Dir.pwd, output_dir)
9
- end
10
-
11
- def extract
12
- find_java_files(@source_dir) do |file|
4
+ # Extracts schemas from avro generated java files.
5
+ module SchemaExtractor
6
+ # Parse schemas from avro generated java files and
7
+ # load them into the schema repository.
8
+ #
9
+ # source_dir - root directory of java files [String]
10
+ # output_dir - schema repository [String]
11
+ # returns - [nil]
12
+ def self.extract(source_dir:, output_dir:)
13
+ output_dir = File.join(Dir.pwd, output_dir)
14
+ find_java_files(source_dir) do |file|
13
15
  schema = parse_avro_java_class(file)
14
- write_avsc(schema, @output_dir) if schema
16
+ write_avsc(schema, output_dir) if schema
15
17
  end
18
+ nil
16
19
  end
17
20
 
18
- private
21
+ module_function
19
22
 
20
23
  def find_java_files(root_dir)
21
24
  old_dir = Dir.pwd
@@ -39,11 +42,11 @@ module Kril
39
42
  end
40
43
 
41
44
  def parse_avro_java_class(file)
42
- file.each_line do |line|
45
+ result = file.each_line do |line|
43
46
  extraction = line[/SCHEMA.*parse\("(.*)"\);/, 1]
44
47
  break JSON.parse(dejavafy(extraction)) if extraction
45
- nil
46
48
  end
49
+ result.is_a?(File) ? nil : result
47
50
  end
48
51
  end
49
52
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kril
4
+ # Saves schemas to repository.
5
+ class SchemaHandler
6
+ # schemas_path - directory of schema repository [String]
7
+ # schema_store - schema store [AvroTurf::SchemaStore]
8
+ def initialize(schemas_path: 'schemas/',
9
+ schema_store: nil)
10
+ schema_store ||= AvroTurf::SchemaStore.new(path: schemas_path)
11
+ @schema_store = schema_store
12
+ @schemas_path = schemas_path
13
+ end
14
+
15
+ # Handles input to reference or create schema.
16
+ #
17
+ # input_string - schema name, schema file, or schema contents [String]
18
+ # returns - schema name [String]
19
+ def process(input_string)
20
+ if File.exist?(input_string)
21
+ copy_schema_to_store(input_string)
22
+ elsif schema?(input_string)
23
+ save_schema(input_string)
24
+ else
25
+ @schema_store.find(input_string).name
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def schema?(input)
32
+ JSON.parse(input)['name']
33
+ rescue StandardError
34
+ false
35
+ end
36
+
37
+ def save_schema(schema)
38
+ schema = JSON.parse(schema)
39
+ 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
43
+ end
44
+
45
+ def copy_schema_to_store(path)
46
+ schema = File.read(path)
47
+ raise ArgumentError.new, "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
52
+ end
53
+ end
54
+ end
data/lib/kril/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kril
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
data/lib/kril.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'kril/version'
4
4
  require 'kril/record_builder'
5
5
  require 'kril/schema_extractor'
6
+ require 'kril/schema_handler'
6
7
  require 'kril/producer'
7
8
  require 'kril/consumer'
8
9
  require 'json'
@@ -11,7 +12,11 @@ require 'logger'
11
12
  require 'avro_turf/messaging'
12
13
  require 'kafka'
13
14
  require 'securerandom'
15
+ require 'fileutils'
14
16
 
15
- # TODO
17
+ # Simple, easy to use API for interacting with
18
+ # Apache Kafka with Apache Avro. Intended for
19
+ # experimentation in development, as nothing here
20
+ # is optimized for performance.
16
21
  module Kril
17
22
  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.0
4
+ version: 0.1.1
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-04 00:00:00.000000000 Z
11
+ date: 2018-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro_turf
@@ -175,8 +175,10 @@ files:
175
175
  - ".idea/modules.xml"
176
176
  - ".idea/vcs.xml"
177
177
  - ".idea/workspace.xml"
178
+ - ".rspec"
178
179
  - ".travis.yml"
179
180
  - Gemfile
181
+ - Gemfile.lock
180
182
  - LICENSE.txt
181
183
  - README.md
182
184
  - Rakefile
@@ -187,6 +189,7 @@ files:
187
189
  - lib/kril/producer.rb
188
190
  - lib/kril/record_builder.rb
189
191
  - lib/kril/schema_extractor.rb
192
+ - lib/kril/schema_handler.rb
190
193
  - lib/kril/version.rb
191
194
  homepage: https://github.com/ChadBowman/kril
192
195
  licenses: