pio 0.30.0 → 0.30.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 +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +6 -49
- data/Rakefile +4 -4
- data/features/{arp.feature → arp/arp.feature} +14 -30
- data/features/arp/arp_reply.feature +69 -0
- data/features/arp/arp_request.feature +67 -0
- data/features/dhcp.feature +157 -162
- data/features/ethernet_header.feature +149 -0
- data/features/icmp/icmp.feature +47 -0
- data/features/icmp/icmp_reply.feature +93 -0
- data/features/icmp/icmp_request.feature +89 -0
- data/features/ipv4_header.feature +89 -0
- data/features/lldp.feature +5 -8
- data/features/open_flow/header.feature +13 -0
- data/features/open_flow/nicira_resubmit.feature +4 -22
- data/features/open_flow/nicira_resubmit_table.feature +6 -16
- data/features/open_flow10/aggregate_stats_reply.feature +5 -7
- data/features/open_flow10/aggregate_stats_request.feature +12 -14
- data/features/open_flow10/bad_request.feature +7 -24
- data/features/open_flow10/barrier_reply.feature +14 -25
- data/features/open_flow10/barrier_request.feature +12 -25
- data/features/open_flow10/description_stats_reply.feature +9 -7
- data/features/open_flow10/description_stats_request.feature +12 -25
- data/features/open_flow10/echo_reply.feature +14 -35
- data/features/open_flow10/echo_request.feature +16 -39
- data/features/open_flow10/enqueue.feature +3 -4
- data/features/open_flow10/exact_match.feature +5 -5
- data/features/open_flow10/features_reply.feature +28 -73
- data/features/open_flow10/features_request.feature +10 -28
- data/features/open_flow10/flow_mod.feature +4 -188
- data/features/open_flow10/flow_removed.feature +28 -30
- data/features/open_flow10/flow_stats_reply.feature +5 -89
- data/features/open_flow10/flow_stats_request.feature +12 -42
- data/features/open_flow10/hello.feature +10 -32
- data/features/open_flow10/hello_failed.feature +7 -57
- data/features/open_flow10/packet_in.feature +130 -49
- data/features/open_flow10/packet_out.feature +29 -18
- data/features/open_flow10/port_stats_request.feature +8 -29
- data/features/open_flow10/port_status.feature +22 -21
- data/features/open_flow10/queue_stats_request.feature +12 -30
- data/features/open_flow10/send_out_port.feature +17 -25
- data/features/open_flow10/set_destination_mac_address.feature +3 -4
- data/features/open_flow10/set_ip_destination_address.feature +3 -4
- data/features/open_flow10/set_source_ip_address.feature +3 -4
- data/features/open_flow10/set_source_mac_address.feature +3 -4
- data/features/open_flow10/set_tos.feature +3 -4
- data/features/open_flow10/set_transport_destination_port.feature +3 -4
- data/features/open_flow10/set_transport_source_port.feature +3 -4
- data/features/open_flow10/set_vlan_priority.feature +3 -4
- data/features/open_flow10/set_vlan_vid.feature +3 -4
- data/features/open_flow10/strip_vlan_header.feature +3 -4
- data/features/open_flow10/table_stats_request.feature +11 -13
- data/features/open_flow10/vendor_action.feature +4 -5
- data/features/open_flow13/apply_actions.feature +15 -18
- data/features/open_flow13/bad_request.feature +7 -13
- data/features/open_flow13/copy_ttl_inwards.feature +13 -0
- data/features/open_flow13/copy_ttl_outwards.feature +13 -0
- data/features/open_flow13/decrement_ip_ttl.feature +11 -0
- data/features/open_flow13/echo_reply.feature +16 -42
- data/features/open_flow13/echo_request.feature +16 -42
- data/features/open_flow13/features_reply.feature +4 -25
- data/features/open_flow13/features_request.feature +7 -36
- data/features/open_flow13/flow_mod.feature +16 -76
- data/features/open_flow13/goto_table.feature +18 -20
- data/features/open_flow13/hello.feature +7 -37
- data/features/open_flow13/hello_failed.feature +7 -30
- data/features/open_flow13/match.feature +239 -248
- data/features/open_flow13/meter.feature +18 -20
- data/features/open_flow13/nicira_conjunction.feature +15 -0
- data/features/open_flow13/nicira_reg_load.feature +27 -42
- data/features/open_flow13/nicira_reg_move.feature +41 -35
- data/features/open_flow13/nicira_send_out_port.feature +21 -13
- data/features/open_flow13/nicira_stack_pop.feature +26 -0
- data/features/open_flow13/nicira_stack_push.feature +26 -0
- data/features/open_flow13/packet_in.feature +7 -34
- data/features/open_flow13/packet_out.feature +7 -45
- data/features/open_flow13/send_out_port.feature +19 -28
- data/features/open_flow13/set_arp_operation.feature +4 -5
- data/features/open_flow13/set_arp_sender_hardware_address.feature +3 -4
- data/features/open_flow13/set_arp_sender_protocol_address.feature +3 -4
- data/features/open_flow13/set_destination_mac_address.feature +3 -4
- data/features/open_flow13/set_ip_ttl.feature +12 -0
- data/features/open_flow13/set_metadata.feature +3 -4
- data/features/open_flow13/set_source_mac_address.feature +3 -4
- data/features/open_flow13/stats_request.feature +4 -7
- data/features/open_flow13/write_metadata.feature +20 -22
- data/features/open_flow_read.feature +24 -5
- data/features/open_flow_version.feature +1 -1
- data/features/parser.feature +8 -9
- data/features/step_definitions/open_flow_steps.rb +11 -16
- data/features/step_definitions/packet_data_steps.rb +16 -32
- data/features/step_definitions/ruby_steps.rb +7 -0
- data/features/step_definitions/show_stats_steps.rb +3 -3
- data/features/support/env.rb +1 -0
- data/features/support/hooks.rb +2 -2
- data/features/udp.feature +26 -27
- data/lib/pio.rb +1 -1
- data/lib/pio/arp.rb +9 -6
- data/lib/pio/arp/format.rb +3 -7
- data/lib/pio/arp/message.rb +8 -4
- data/lib/pio/arp/reply.rb +9 -32
- data/lib/pio/arp/request.rb +9 -33
- data/lib/pio/class_inspector.rb +18 -0
- data/lib/pio/dhcp.rb +2 -2
- data/lib/pio/dhcp/frame.rb +4 -4
- data/lib/pio/dhcp/optional_tlv.rb +3 -3
- data/lib/pio/ethernet_frame.rb +20 -0
- data/lib/pio/ethernet_header.rb +35 -13
- data/lib/pio/icmp.rb +8 -5
- data/lib/pio/icmp/format.rb +19 -22
- data/lib/pio/icmp/message.rb +18 -4
- data/lib/pio/icmp/reply.rb +8 -34
- data/lib/pio/icmp/request.rb +8 -43
- data/lib/pio/instance_inspector.rb +14 -0
- data/lib/pio/ipv4_address.rb +11 -11
- data/lib/pio/ipv4_header.rb +24 -2
- data/lib/pio/lldp/frame.rb +2 -2
- data/lib/pio/lldp/optional_tlv.rb +2 -2
- data/lib/pio/mac.rb +7 -3
- data/lib/pio/message.rb +50 -0
- data/lib/pio/monkey_patch/bindata_record.rb +6 -0
- data/lib/pio/monkey_patch/bindata_string.rb +10 -0
- data/lib/pio/monkey_patch/integer/base_conversions.rb +1 -1
- data/lib/pio/monkey_patch/uint.rb +9 -0
- data/lib/pio/monkey_patch/uint/base_conversions.rb +14 -0
- data/lib/pio/open_flow.rb +38 -52
- data/lib/pio/open_flow/action.rb +8 -4
- data/lib/pio/open_flow/buffer_id.rb +19 -0
- data/lib/pio/open_flow/datapath_id.rb +3 -3
- data/lib/pio/open_flow/error_message.rb +32 -0
- data/lib/pio/open_flow/flags.rb +15 -6
- data/lib/pio/open_flow/flow_match.rb +10 -0
- data/lib/pio/open_flow/header.rb +26 -0
- data/lib/pio/open_flow/hello_failed_code.rb +1 -1
- data/lib/pio/open_flow/instruction.rb +10 -0
- data/lib/pio/open_flow/message.rb +49 -14
- data/lib/pio/open_flow/nicira_resubmit.rb +13 -11
- data/lib/pio/open_flow/nicira_resubmit_table.rb +17 -10
- data/lib/pio/open_flow/parser.rb +19 -0
- data/lib/pio/open_flow/port.rb +2 -2
- data/lib/pio/open_flow/transaction_id.rb +2 -2
- data/lib/pio/open_flow/version.rb +22 -0
- data/lib/pio/open_flow10/actions.rb +16 -16
- data/lib/pio/open_flow10/aggregate_stats/reply.rb +2 -1
- data/lib/pio/open_flow10/aggregate_stats/request.rb +1 -3
- data/lib/pio/open_flow10/barrier/reply.rb +1 -1
- data/lib/pio/open_flow10/barrier/request.rb +1 -1
- data/lib/pio/open_flow10/description_stats/reply.rb +1 -1
- data/lib/pio/open_flow10/description_stats/request.rb +1 -3
- data/lib/pio/open_flow10/echo/reply.rb +3 -3
- data/lib/pio/open_flow10/echo/request.rb +3 -3
- data/lib/pio/open_flow10/enqueue.rb +3 -3
- data/lib/pio/open_flow10/error.rb +3 -13
- data/lib/pio/open_flow10/error/bad_request.rb +5 -29
- data/lib/pio/open_flow10/error/bad_request/bad_request_code.rb +35 -0
- data/lib/pio/open_flow10/error/error_type10.rb +1 -1
- data/lib/pio/open_flow10/error/hello_failed.rb +6 -4
- data/lib/pio/open_flow10/exact_match.rb +12 -10
- data/lib/pio/open_flow10/features/reply.rb +16 -31
- data/lib/pio/open_flow10/features/request.rb +1 -4
- data/lib/pio/open_flow10/flow_mod.rb +8 -33
- data/lib/pio/open_flow10/flow_mod/command.rb +28 -0
- data/lib/pio/open_flow10/flow_removed.rb +2 -17
- data/lib/pio/open_flow10/flow_removed/reason.rb +22 -0
- data/lib/pio/open_flow10/flow_stats/reply.rb +3 -4
- data/lib/pio/open_flow10/flow_stats/request.rb +1 -3
- data/lib/pio/open_flow10/hello.rb +1 -4
- data/lib/pio/open_flow10/match.rb +13 -12
- data/lib/pio/open_flow10/packet_in.rb +32 -28
- data/lib/pio/open_flow10/packet_in/reason.rb +25 -0
- data/lib/pio/open_flow10/packet_out.rb +5 -6
- data/lib/pio/open_flow10/phy_port16.rb +36 -58
- data/lib/pio/open_flow10/port_stats/request.rb +1 -3
- data/lib/pio/open_flow10/port_status.rb +23 -30
- data/lib/pio/open_flow10/port_status/reason.rb +21 -0
- data/lib/pio/open_flow10/queue_stats/request.rb +1 -3
- data/lib/pio/open_flow10/send_out_port.rb +2 -2
- data/lib/pio/open_flow10/set_tos.rb +2 -2
- data/lib/pio/open_flow10/set_transport_port.rb +4 -2
- data/lib/pio/open_flow10/set_vlan_priority.rb +1 -1
- data/lib/pio/open_flow10/set_vlan_vid.rb +1 -1
- data/lib/pio/open_flow10/stats_reply.rb +7 -10
- data/lib/pio/open_flow10/stats_request.rb +16 -15
- data/lib/pio/open_flow10/stats_type.rb +1 -1
- data/lib/pio/open_flow10/table_stats/request.rb +1 -3
- data/lib/pio/open_flow10/vendor_action.rb +22 -20
- data/lib/pio/open_flow13.rb +7 -0
- data/lib/pio/open_flow13/actions.rb +34 -32
- data/lib/pio/open_flow13/apply.rb +25 -22
- data/lib/pio/open_flow13/copy_ttl_inwards.rb +15 -0
- data/lib/pio/open_flow13/copy_ttl_outwards.rb +15 -0
- data/lib/pio/open_flow13/decrement_ip_ttl.rb +15 -0
- data/lib/pio/open_flow13/echo/reply.rb +3 -3
- data/lib/pio/open_flow13/echo/request.rb +3 -3
- data/lib/pio/open_flow13/error.rb +7 -18
- data/lib/pio/open_flow13/error/bad_request.rb +4 -3
- data/lib/pio/open_flow13/error/error_type13.rb +1 -1
- data/lib/pio/open_flow13/error/hello_failed.rb +3 -2
- data/lib/pio/open_flow13/features/reply.rb +9 -16
- data/lib/pio/open_flow13/features/request.rb +1 -1
- data/lib/pio/open_flow13/flow_mod.rb +14 -19
- data/lib/pio/open_flow13/goto_table.rb +26 -24
- data/lib/pio/open_flow13/hello.rb +3 -4
- data/lib/pio/open_flow13/match.rb +173 -9
- data/lib/pio/open_flow13/meter.rb +23 -20
- data/lib/pio/open_flow13/nicira_conjunction.rb +26 -0
- data/lib/pio/open_flow13/nicira_reg_load.rb +44 -24
- data/lib/pio/open_flow13/nicira_reg_move.rb +77 -35
- data/lib/pio/open_flow13/nicira_send_out_port.rb +37 -21
- data/lib/pio/open_flow13/nicira_stack_pop.rb +49 -0
- data/lib/pio/open_flow13/nicira_stack_push.rb +49 -0
- data/lib/pio/open_flow13/packet_in.rb +11 -8
- data/lib/pio/open_flow13/packet_out.rb +9 -8
- data/lib/pio/open_flow13/set_ip_ttl.rb +16 -0
- data/lib/pio/open_flow13/stats_request.rb +2 -4
- data/lib/pio/open_flow13/write_metadata.rb +40 -38
- data/lib/pio/options.rb +8 -3
- data/lib/pio/parser.rb +7 -16
- data/lib/pio/ruby_dumper.rb +69 -0
- data/lib/pio/type/ether_type.rb +31 -0
- data/lib/pio/type/ip_address.rb +8 -0
- data/lib/pio/type/mac_address.rb +10 -0
- data/lib/pio/udp.rb +3 -3
- data/lib/pio/udp_header.rb +1 -1
- data/lib/pio/version.rb +1 -1
- data/pio.gemspec +5 -38
- data/spec/pio/arp/reply_spec.rb +0 -4
- data/spec/pio/arp/request_spec.rb +0 -4
- data/spec/pio/arp_spec.rb +0 -4
- data/spec/pio/icmp/reply_spec.rb +4 -8
- data/spec/pio/icmp/request_spec.rb +6 -10
- data/spec/pio/icmp_spec.rb +8 -12
- data/spec/pio/monkey_patch/integer_spec.rb +23 -0
- data/spec/pio/open_flow/nicira_resubmit_spec.rb +19 -0
- data/spec/pio/open_flow/nicira_resubmit_table_spec.rb +20 -0
- data/spec/pio/open_flow10/error/hello_failed_spec.rb +2 -2
- data/spec/pio/open_flow10/flow_mod_spec.rb +24 -24
- data/spec/pio/open_flow10/flow_stats_request_spec.rb +3 -3
- data/spec/pio/open_flow10/hello_spec.rb +0 -2
- data/spec/pio/open_flow10/match_spec.rb +38 -38
- data/spec/pio/open_flow10/packet_out_spec.rb +0 -349
- data/spec/pio/open_flow10/phy_port16_spec.rb +5 -5
- data/spec/pio/open_flow13/error/hello_failed_spec.rb +2 -2
- data/spec/pio/open_flow13/goto_table_spec.rb +2 -2
- data/spec/pio/open_flow13/hello_spec.rb +15 -15
- data/spec/pio/open_flow13/match_spec.rb +29 -29
- data/spec/pio/open_flow13/meter_spec.rb +2 -2
- data/spec/pio/open_flow13/nicira_reg_load_spec.rb +71 -0
- data/spec/pio/open_flow13/nicira_reg_move_spec.rb +40 -0
- data/spec/pio/open_flow13/nicira_send_out_port_spec.rb +29 -0
- data/spec/pio/open_flow13/write_metadata_spec.rb +3 -3
- data/spec/pio/open_flow_spec.rb +6 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/shared_examples_for_openflow_messages.rb +5 -13
- metadata +191 -790
- data/LICENSE +0 -674
- data/bin/_guard-core +0 -16
- data/bin/byebug +0 -16
- data/bin/cc-tddium-post-worker +0 -16
- data/bin/cdiff +0 -16
- data/bin/coderay +0 -16
- data/bin/colortab +0 -16
- data/bin/coveralls +0 -16
- data/bin/cucumber +0 -16
- data/bin/decolor +0 -16
- data/bin/flay +0 -16
- data/bin/flog +0 -16
- data/bin/guard +0 -16
- data/bin/htmldiff +0 -16
- data/bin/inch +0 -16
- data/bin/ldiff +0 -16
- data/bin/listen +0 -16
- data/bin/minitar +0 -16
- data/bin/pry +0 -16
- data/bin/rake +0 -16
- data/bin/reek +0 -16
- data/bin/relish +0 -16
- data/bin/restclient +0 -16
- data/bin/rspec +0 -16
- data/bin/rubocop +0 -16
- data/bin/ruby-parse +0 -16
- data/bin/ruby-rewrite +0 -16
- data/bin/ruby_parse +0 -16
- data/bin/ruby_parse_extract_error +0 -16
- data/bin/sparkr +0 -16
- data/bin/term_display +0 -16
- data/bin/term_mandel +0 -16
- data/bin/terminal-notifier +0 -16
- data/bin/thor +0 -16
- data/bin/unparser +0 -16
- data/bin/yard +0 -16
- data/bin/yardoc +0 -16
- data/bin/yri +0 -16
- data/features/arp-storm.pcap +0 -0
- data/features/arp.pcap +0 -0
- data/features/dhcp.pcap +0 -0
- data/features/icmp.feature +0 -130
- data/features/icmp.pcap +0 -0
- data/features/icmpv6.pcap +0 -0
- data/features/lldp.detailed.pcap +0 -0
- data/features/lldp.minimal.pcap +0 -0
- data/features/open_flow10/aggregate_stats_reply.raw +0 -0
- data/features/open_flow10/aggregate_stats_request.raw +0 -0
- data/features/open_flow10/bad_request.raw +0 -0
- data/features/open_flow10/barrier_reply.raw +0 -0
- data/features/open_flow10/barrier_request.raw +0 -0
- data/features/open_flow10/description_stats_reply.raw +0 -0
- data/features/open_flow10/description_stats_request.raw +0 -0
- data/features/open_flow10/echo_reply.raw +0 -0
- data/features/open_flow10/echo_request.raw +0 -0
- data/features/open_flow10/error.raw +0 -0
- data/features/open_flow10/features_reply.raw +0 -0
- data/features/open_flow10/features_request.raw +0 -0
- data/features/open_flow10/flow_mod_add.raw +0 -0
- data/features/open_flow10/flow_mod_delete.raw +0 -0
- data/features/open_flow10/flow_mod_delete_strict.raw +0 -0
- data/features/open_flow10/flow_mod_modify.raw +0 -0
- data/features/open_flow10/flow_mod_modify_strict.raw +0 -0
- data/features/open_flow10/flow_removed.raw +0 -0
- data/features/open_flow10/flow_stats_reply.raw +0 -0
- data/features/open_flow10/flow_stats_request.raw +0 -0
- data/features/open_flow10/get_config_reply.raw +0 -0
- data/features/open_flow10/get_config_request.raw +0 -0
- data/features/open_flow10/hello.raw +0 -0
- data/features/open_flow10/hello_failed.raw +0 -0
- data/features/open_flow10/nx_flow_mod_add.raw +0 -0
- data/features/open_flow10/nx_flow_mod_delete.raw +0 -0
- data/features/open_flow10/nx_flow_mod_delete_strict.raw +0 -0
- data/features/open_flow10/nx_flow_mod_modify.raw +0 -0
- data/features/open_flow10/nx_flow_mod_modify_strict.raw +0 -0
- data/features/open_flow10/nxast_learn.raw +0 -0
- data/features/open_flow10/packet_in.raw +0 -0
- data/features/open_flow10/packet_in_arp_reply.raw +0 -0
- data/features/open_flow10/packet_in_arp_request.raw +0 -0
- data/features/open_flow10/packet_in_cbench.raw +0 -0
- data/features/open_flow10/packet_out.raw +0 -0
- data/features/open_flow10/port_mod.raw +0 -0
- data/features/open_flow10/port_stats_reply.raw +0 -0
- data/features/open_flow10/port_stats_request.raw +0 -0
- data/features/open_flow10/port_status.raw +0 -0
- data/features/open_flow10/queue_get_config_reply.raw +0 -0
- data/features/open_flow10/queue_get_config_request.raw +0 -0
- data/features/open_flow10/queue_stats_request.raw +0 -0
- data/features/open_flow10/set_config.raw +0 -0
- data/features/open_flow10/table_stats_reply.raw +0 -0
- data/features/open_flow10/table_stats_request.raw +0 -0
- data/features/open_flow10/vendor.raw +0 -0
- data/features/open_flow10/vendor_stats_request.raw +0 -0
- data/features/open_flow13/action_copy_ttl_in.raw +0 -0
- data/features/open_flow13/action_copy_ttl_out.raw +0 -0
- data/features/open_flow13/action_dec_mpls_ttl.raw +0 -0
- data/features/open_flow13/action_dec_nw_ttl.raw +0 -0
- data/features/open_flow13/action_group.raw +0 -0
- data/features/open_flow13/action_pop_mpls.raw +0 -0
- data/features/open_flow13/action_pop_pbb.raw +0 -0
- data/features/open_flow13/action_pop_vlan.raw +0 -0
- data/features/open_flow13/action_push_mpls.raw +0 -0
- data/features/open_flow13/action_push_pbb.raw +0 -0
- data/features/open_flow13/action_push_vlan.raw +0 -0
- data/features/open_flow13/action_set_field.raw +0 -0
- data/features/open_flow13/action_set_mpls_ttl.raw +0 -0
- data/features/open_flow13/action_set_nw_ttl.raw +0 -0
- data/features/open_flow13/action_set_queue.raw +0 -0
- data/features/open_flow13/apply_actions.raw +0 -0
- data/features/open_flow13/bad_request.raw +0 -0
- data/features/open_flow13/echo_reply_body.raw +0 -0
- data/features/open_flow13/echo_reply_no_body.raw +0 -0
- data/features/open_flow13/echo_request_body.raw +0 -0
- data/features/open_flow13/echo_request_no_body.raw +0 -0
- data/features/open_flow13/features_reply.raw +0 -0
- data/features/open_flow13/features_request.raw +0 -0
- data/features/open_flow13/flow_add_apply_no_match.raw +0 -0
- data/features/open_flow13/flow_mod_add_apply_no_match.raw +0 -0
- data/features/open_flow13/flow_mod_no_match_or_instructions.raw +0 -0
- data/features/open_flow13/hello_failed.raw +0 -0
- data/features/open_flow13/hello_no_version_bitmap.raw +0 -0
- data/features/open_flow13/hello_version_bitmap.raw +0 -0
- data/features/open_flow13/instruction_clear_actions.raw +0 -0
- data/features/open_flow13/instruction_goto_table.raw +0 -0
- data/features/open_flow13/instruction_meter.raw +0 -0
- data/features/open_flow13/instruction_write_actions.raw +0 -0
- data/features/open_flow13/instruction_write_metadata.raw +0 -0
- data/features/open_flow13/oxm_arp_op_field.raw +0 -0
- data/features/open_flow13/oxm_arp_sha_field.raw +0 -0
- data/features/open_flow13/oxm_arp_spa_field.raw +0 -0
- data/features/open_flow13/oxm_arp_tha_field.raw +0 -0
- data/features/open_flow13/oxm_arp_tpa_field.raw +0 -0
- data/features/open_flow13/oxm_ether_destination_field.raw +0 -0
- data/features/open_flow13/oxm_ether_source_field.raw +0 -0
- data/features/open_flow13/oxm_ether_type_field.raw +0 -0
- data/features/open_flow13/oxm_experimenter_stratos_basic_dot11.raw +0 -0
- data/features/open_flow13/oxm_icmpv4_code_field.raw +0 -0
- data/features/open_flow13/oxm_icmpv4_type_field.raw +0 -0
- data/features/open_flow13/oxm_in_phy_port_field.raw +0 -0
- data/features/open_flow13/oxm_in_port_field.raw +0 -0
- data/features/open_flow13/oxm_invalid_field.raw +0 -0
- data/features/open_flow13/oxm_ip_dscp_field.raw +0 -0
- data/features/open_flow13/oxm_ip_ecn_field.raw +0 -0
- data/features/open_flow13/oxm_ipv4_destination_field.raw +0 -0
- data/features/open_flow13/oxm_ipv4_source_field.raw +0 -0
- data/features/open_flow13/oxm_ipv6_destination_field.raw +0 -0
- data/features/open_flow13/oxm_ipv6_source_field.raw +0 -0
- data/features/open_flow13/oxm_masked_arp_sha_field.raw +0 -0
- data/features/open_flow13/oxm_masked_arp_spa_field.raw +0 -0
- data/features/open_flow13/oxm_masked_arp_tha_field.raw +0 -0
- data/features/open_flow13/oxm_masked_arp_tpa_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ether_destination_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ether_source_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ipv4_destination_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ipv4_source_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ipv6_destination_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ipv6_source_field.raw +0 -0
- data/features/open_flow13/oxm_masked_tunnel_id_field.raw +0 -0
- data/features/open_flow13/oxm_metadata_field.raw +0 -0
- data/features/open_flow13/oxm_metadata_masked_field.raw +0 -0
- data/features/open_flow13/oxm_no_fields.raw +0 -0
- data/features/open_flow13/oxm_sctp_destination_field.raw +0 -0
- data/features/open_flow13/oxm_sctp_source_field.raw +0 -0
- data/features/open_flow13/oxm_tcp_destination_field.raw +0 -0
- data/features/open_flow13/oxm_tcp_field.raw +0 -0
- data/features/open_flow13/oxm_tcp_source_field.raw +0 -0
- data/features/open_flow13/oxm_tunnel_id_field.raw +0 -0
- data/features/open_flow13/oxm_udp_destination_field.raw +0 -0
- data/features/open_flow13/oxm_udp_field.raw +0 -0
- data/features/open_flow13/oxm_udp_source_field.raw +0 -0
- data/features/open_flow13/oxm_vlan_pcp_field.raw +0 -0
- data/features/open_flow13/oxm_vlan_vid_field.raw +0 -0
- data/features/open_flow13/packet_in.raw +0 -0
- data/features/open_flow13/packet_out.raw +0 -0
- data/features/open_flow13/send_out_port.raw +0 -0
- data/features/open_flow13/table_stats_reply.raw +0 -0
- data/features/open_flow13/table_stats_request.raw +0 -0
- data/features/step_definitions/LICENSE +0 -675
- data/features/udp_no_payload.raw +0 -0
- data/features/udp_with_payload.raw +0 -0
- data/lib/pio/icmp/options.rb +0 -21
- data/lib/pio/open_flow/error.rb +0 -19
- data/lib/pio/open_flow/open_flow_header.rb +0 -31
- data/lib/pio/open_flow13/buffer_id.rb +0 -17
- data/spec/pio/arp/reply/options_spec.rb +0 -143
- data/spec/pio/arp/request/options_spec.rb +0 -113
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
require 'active_support/core_ext/object/try'
|
|
1
2
|
require 'pio/open_flow'
|
|
3
|
+
require 'pio/open_flow/buffer_id'
|
|
2
4
|
require 'pio/open_flow13/actions'
|
|
3
|
-
require 'pio/open_flow13/buffer_id'
|
|
4
5
|
|
|
5
6
|
module Pio
|
|
6
7
|
module OpenFlow13
|
|
@@ -14,7 +15,7 @@ module Pio
|
|
|
14
15
|
uint32 :in_port
|
|
15
16
|
|
|
16
17
|
def get
|
|
17
|
-
|
|
18
|
+
in_port == CONTROLLER ? :controller : in_port
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
def set(value)
|
|
@@ -22,24 +23,24 @@ module Pio
|
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
|
|
25
|
-
open_flow_header(version: 4,
|
|
26
|
-
|
|
27
|
-
message_length: lambda do
|
|
26
|
+
open_flow_header(version: 4, type: 13,
|
|
27
|
+
length: lambda do
|
|
28
28
|
24 + actions_length + raw_data.length
|
|
29
29
|
end)
|
|
30
30
|
buffer_id :buffer_id
|
|
31
31
|
in_port :in_port
|
|
32
32
|
uint16 :actions_length, initial_value: -> { actions.binary.length }
|
|
33
33
|
string :padding, length: 6
|
|
34
|
-
|
|
35
|
-
string :raw_data, read_length: -> {
|
|
34
|
+
actions13 :actions, length: :actions_length
|
|
35
|
+
string :raw_data, read_length: -> { length - 24 - actions_length }
|
|
36
36
|
|
|
37
37
|
def data
|
|
38
38
|
@data ||= Pio::Parser.read(raw_data)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def method_missing(method, *args)
|
|
42
|
-
data.__send__(method, *args)
|
|
42
|
+
bindata_value = data.__send__(method, *args)
|
|
43
|
+
bindata_value.try(:snapshot) || bindata_value
|
|
43
44
|
end
|
|
44
45
|
end
|
|
45
46
|
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'pio/open_flow/action'
|
|
2
|
+
|
|
3
|
+
module Pio
|
|
4
|
+
module OpenFlow13
|
|
5
|
+
# Sets IP TTL
|
|
6
|
+
class SetIpTtl < OpenFlow::Action
|
|
7
|
+
action_header action_type: 23, action_length: 8
|
|
8
|
+
uint8 :ttl
|
|
9
|
+
string :padding, length: 3
|
|
10
|
+
|
|
11
|
+
def initialize(ttl)
|
|
12
|
+
super(ttl: ttl)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -12,7 +12,7 @@ module Pio
|
|
|
12
12
|
:table,
|
|
13
13
|
:port,
|
|
14
14
|
:queue,
|
|
15
|
-
:vendor]
|
|
15
|
+
:vendor].freeze
|
|
16
16
|
|
|
17
17
|
endian :big
|
|
18
18
|
|
|
@@ -27,9 +27,7 @@ module Pio
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
open_flow_header version: 4,
|
|
31
|
-
message_type: 16,
|
|
32
|
-
message_length: 12
|
|
30
|
+
open_flow_header version: 4, type: 16, length: 12
|
|
33
31
|
stats_type :stats_type
|
|
34
32
|
uint16 :stats_flags
|
|
35
33
|
end
|
|
@@ -1,52 +1,54 @@
|
|
|
1
1
|
require 'forwardable'
|
|
2
|
+
require 'pio/open_flow/action'
|
|
2
3
|
|
|
3
|
-
# Base module.
|
|
4
4
|
module Pio
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
module OpenFlow13
|
|
6
|
+
# Write metadata
|
|
7
|
+
class WriteMetadata < OpenFlow::Action
|
|
8
|
+
# OpenFlow 1.3.4 OFPIT_WRITE_METADATA instruction format
|
|
9
|
+
class Format < BinData::Record
|
|
10
|
+
endian :big
|
|
11
|
+
|
|
12
|
+
uint16 :instruction_type, value: 2
|
|
13
|
+
uint16 :instruction_length, value: 24
|
|
14
|
+
uint32 :padding
|
|
15
|
+
uint64 :metadata
|
|
16
|
+
uint64 :metadata_mask
|
|
17
|
+
end
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
def self.read(raw_data)
|
|
20
|
+
allocate.tap do |write_metadata|
|
|
21
|
+
write_metadata.instance_variable_set :@format, Format.read(raw_data)
|
|
22
|
+
end
|
|
21
23
|
end
|
|
22
|
-
end
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
extend Forwardable
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
def_delegators :@format, :instruction_type
|
|
28
|
+
def_delegators :@format, :instruction_length
|
|
29
|
+
def_delegators :@format, :metadata
|
|
30
|
+
def_delegators :@format, :metadata_mask
|
|
31
|
+
def_delegators :@format, :to_binary_s
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
def initialize(user_options)
|
|
34
|
+
@options = user_options
|
|
35
|
+
@format = Format.new(options)
|
|
36
|
+
end
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
def options
|
|
39
|
+
{
|
|
40
|
+
metadata: metadata_option,
|
|
41
|
+
metadata_mask: metadata_mask_option
|
|
42
|
+
}
|
|
43
|
+
end
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
def metadata_option
|
|
46
|
+
@options[:metadata]
|
|
47
|
+
end
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
def metadata_mask_option
|
|
50
|
+
@options[:metadata_mask]
|
|
51
|
+
end
|
|
50
52
|
end
|
|
51
53
|
end
|
|
52
54
|
end
|
data/lib/pio/options.rb
CHANGED
|
@@ -14,6 +14,11 @@ module Pio
|
|
|
14
14
|
const_get(:OPTIONS) << name
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
+
def initialize(options)
|
|
18
|
+
validate options
|
|
19
|
+
@options = options
|
|
20
|
+
end
|
|
21
|
+
|
|
17
22
|
private
|
|
18
23
|
|
|
19
24
|
def validate(user_options)
|
|
@@ -42,7 +47,7 @@ module Pio
|
|
|
42
47
|
def check_unknown(user_options)
|
|
43
48
|
valid_options = mandatory_options + options
|
|
44
49
|
user_options.keys.each do |each|
|
|
45
|
-
|
|
50
|
+
raise "Unknown option: #{each}." unless valid_options.include?(each)
|
|
46
51
|
end
|
|
47
52
|
end
|
|
48
53
|
|
|
@@ -54,10 +59,10 @@ module Pio
|
|
|
54
59
|
|
|
55
60
|
def check_existence(user_options, key)
|
|
56
61
|
value = user_options.fetch(key) do |missing_key|
|
|
57
|
-
|
|
62
|
+
raise ArgumentError, "The #{missing_key} option should be passed."
|
|
58
63
|
end
|
|
59
64
|
return if value
|
|
60
|
-
|
|
65
|
+
raise(ArgumentError, "The #{key} option shouldn't be #{value.inspect}.")
|
|
61
66
|
end
|
|
62
67
|
end
|
|
63
68
|
end
|
data/lib/pio/parser.rb
CHANGED
|
@@ -1,27 +1,18 @@
|
|
|
1
|
+
require 'pio/ethernet_frame'
|
|
1
2
|
require 'pio/ethernet_header'
|
|
2
3
|
require 'pio/ipv4_header'
|
|
3
4
|
|
|
4
5
|
module Pio
|
|
5
6
|
# Raw data parser.
|
|
6
7
|
class Parser
|
|
7
|
-
# Ethernet header parser
|
|
8
|
-
class EthernetFrame < BinData::Record
|
|
9
|
-
endian :big
|
|
10
|
-
|
|
11
|
-
mac_address :destination_mac
|
|
12
|
-
mac_address :source_mac
|
|
13
|
-
uint16 :ether_type
|
|
14
|
-
rest :rest
|
|
15
|
-
end
|
|
16
|
-
|
|
17
8
|
# IPv4 packet parser
|
|
18
9
|
class IPv4Packet < BinData::Record
|
|
19
|
-
include
|
|
20
|
-
include
|
|
10
|
+
include Ethernet
|
|
11
|
+
include IPv4
|
|
21
12
|
|
|
22
13
|
endian :big
|
|
23
14
|
|
|
24
|
-
ethernet_header ether_type:
|
|
15
|
+
ethernet_header ether_type: Ethernet::Type::IPV4
|
|
25
16
|
ipv4_header
|
|
26
17
|
|
|
27
18
|
uint16 :transport_source_port
|
|
@@ -33,11 +24,11 @@ module Pio
|
|
|
33
24
|
def self.read(raw_data)
|
|
34
25
|
ethernet_frame = EthernetFrame.read(raw_data)
|
|
35
26
|
case ethernet_frame.ether_type
|
|
36
|
-
when
|
|
27
|
+
when Ethernet::Type::IPV4, Ethernet::Type::VLAN
|
|
37
28
|
IPv4Packet.read raw_data
|
|
38
|
-
when
|
|
29
|
+
when Ethernet::Type::ARP
|
|
39
30
|
Pio::Arp.read raw_data
|
|
40
|
-
when
|
|
31
|
+
when Ethernet::Type::LLDP
|
|
41
32
|
Pio::Lldp.read raw_data
|
|
42
33
|
else
|
|
43
34
|
ethernet_frame
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module Pio
|
|
2
|
+
# defines to_ruby method
|
|
3
|
+
module RubyDumper
|
|
4
|
+
# Returns a Ruby code representation of this packet, such that
|
|
5
|
+
# it can be eval'ed and sent later.
|
|
6
|
+
#
|
|
7
|
+
# rubocop:disable AbcSize
|
|
8
|
+
# rubocop:disable MethodLength
|
|
9
|
+
# rubocop:disable CyclomaticComplexity
|
|
10
|
+
# rubocop:disable PerceivedComplexity
|
|
11
|
+
def to_ruby
|
|
12
|
+
pack_template = ''
|
|
13
|
+
bytes = ''
|
|
14
|
+
bit = false
|
|
15
|
+
bit_names = []
|
|
16
|
+
total_bit_length = 0
|
|
17
|
+
field_names.each do |each|
|
|
18
|
+
next unless __send__("#{each}?")
|
|
19
|
+
if /Bit(\d+)$/ =~ __send__(each).class.to_s
|
|
20
|
+
bit_length = Regexp.last_match(1).to_i
|
|
21
|
+
total_bit_length += bit_length
|
|
22
|
+
if bit
|
|
23
|
+
bit_names << each
|
|
24
|
+
bytes << format("_%0#{bit_length}b", __send__(each))
|
|
25
|
+
else
|
|
26
|
+
bit_names = [each]
|
|
27
|
+
bytes << format(" 0b%0#{bit_length}b", __send__(each))
|
|
28
|
+
end
|
|
29
|
+
bit = true
|
|
30
|
+
else
|
|
31
|
+
if bit
|
|
32
|
+
bytes << ", # #{bit_names.join(', ')}\n"
|
|
33
|
+
if total_bit_length == 8
|
|
34
|
+
pack_template << 'C'
|
|
35
|
+
elsif total_bit_length == 16
|
|
36
|
+
pack_template << 'n'
|
|
37
|
+
else
|
|
38
|
+
raise
|
|
39
|
+
end
|
|
40
|
+
total_bit_length = 0
|
|
41
|
+
bit_names = []
|
|
42
|
+
bit = false
|
|
43
|
+
end
|
|
44
|
+
list = (@format || self).__send__(each).to_bytes
|
|
45
|
+
next if list.empty?
|
|
46
|
+
bytes << " #{list}, # #{each}\n"
|
|
47
|
+
pack_template << 'C' * (list.count(',') + 1)
|
|
48
|
+
end
|
|
49
|
+
end.compact
|
|
50
|
+
|
|
51
|
+
template = ''
|
|
52
|
+
until pack_template.empty?
|
|
53
|
+
if /^(.)(\1+)/ =~ pack_template
|
|
54
|
+
pack_template.sub!(/^(.)(\1+)/, '')
|
|
55
|
+
template <<
|
|
56
|
+
"#{Regexp.last_match(1)}#{Regexp.last_match(2).length + 1}"
|
|
57
|
+
else
|
|
58
|
+
pack_template.sub!(/^(.)/, '')
|
|
59
|
+
template << Regexp.last_match(1)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
"[\n#{bytes}].pack('#{template}')"
|
|
63
|
+
end
|
|
64
|
+
# rubocop:enable AbcSize
|
|
65
|
+
# rubocop:enable MethodLength
|
|
66
|
+
# rubocop:enable CyclomaticComplexity
|
|
67
|
+
# rubocop:enable PerceivedComplexity
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'bindata'
|
|
2
|
+
|
|
3
|
+
module Pio
|
|
4
|
+
module Type
|
|
5
|
+
# Ether type
|
|
6
|
+
class EtherType < BinData::Primitive
|
|
7
|
+
endian :big
|
|
8
|
+
|
|
9
|
+
uint16 :ether_type
|
|
10
|
+
|
|
11
|
+
def set(value)
|
|
12
|
+
self.ether_type = value
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def get
|
|
16
|
+
ether_type
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# This method smells of :reek:UncommunicativeVariableName
|
|
20
|
+
def to_bytes
|
|
21
|
+
byte1 = format('%02x', (self & 0xff00) >> 8)
|
|
22
|
+
byte2 = format('%02x', self & 0xff)
|
|
23
|
+
"0x#{byte1}, 0x#{byte2}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def inspect
|
|
27
|
+
Kernel.format '0x%04x', self
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
data/lib/pio/type/ip_address.rb
CHANGED
data/lib/pio/type/mac_address.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require 'bindata'
|
|
2
2
|
require 'pio/mac'
|
|
3
|
+
require 'pio/monkey_patch/integer'
|
|
4
|
+
require 'pio/monkey_patch/uint'
|
|
3
5
|
|
|
4
6
|
module Pio
|
|
5
7
|
module Type
|
|
@@ -16,6 +18,14 @@ module Pio
|
|
|
16
18
|
str + format('%02x', each)
|
|
17
19
|
end.hex)
|
|
18
20
|
end
|
|
21
|
+
|
|
22
|
+
def to_bytes
|
|
23
|
+
octets.map(&:to_hex).join(', ')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def inspect
|
|
27
|
+
%("#{get}")
|
|
28
|
+
end
|
|
19
29
|
end
|
|
20
30
|
end
|
|
21
31
|
end
|
data/lib/pio/udp.rb
CHANGED
|
@@ -6,12 +6,12 @@ require 'pio/udp_header'
|
|
|
6
6
|
module Pio
|
|
7
7
|
# UDP packet format
|
|
8
8
|
class Udp < BinData::Record
|
|
9
|
-
include
|
|
10
|
-
include
|
|
9
|
+
include Ethernet
|
|
10
|
+
include IPv4
|
|
11
11
|
include UdpHeader
|
|
12
12
|
|
|
13
13
|
endian :big
|
|
14
|
-
ethernet_header ether_type:
|
|
14
|
+
ethernet_header ether_type: Ethernet::Type::IPV4
|
|
15
15
|
ipv4_header ip_protocol: ProtocolNumber::UDP
|
|
16
16
|
udp_header
|
|
17
17
|
rest :udp_payload
|
data/lib/pio/udp_header.rb
CHANGED
data/lib/pio/version.rb
CHANGED
data/pio.gemspec
CHANGED
|
@@ -8,57 +8,24 @@ Gem::Specification.new do |gem|
|
|
|
8
8
|
gem.summary = 'Packet parser and generator.'
|
|
9
9
|
gem.description = 'Pure ruby packet parser and generator.'
|
|
10
10
|
|
|
11
|
-
gem.
|
|
11
|
+
gem.licenses = %w(GPLv2 MIT)
|
|
12
12
|
|
|
13
13
|
gem.authors = ['Yasuhito Takamiya']
|
|
14
14
|
gem.email = ['yasuhito@gmail.com']
|
|
15
15
|
gem.homepage = 'http://github.com/trema/pio'
|
|
16
16
|
|
|
17
|
-
gem.files = %w(CONTRIBUTING.md
|
|
17
|
+
gem.files = %w(CONTRIBUTING.md Rakefile pio.gemspec)
|
|
18
18
|
gem.files += Dir.glob('lib/**/*.rb')
|
|
19
|
-
gem.files += Dir.glob('bin/**/*')
|
|
20
19
|
gem.files += Dir.glob('spec/**/*')
|
|
21
|
-
gem.files += Dir.glob('examples/**/*')
|
|
22
20
|
|
|
23
21
|
gem.require_paths = ['lib']
|
|
24
22
|
|
|
25
|
-
gem.extra_rdoc_files = %w(README.md CHANGELOG.md
|
|
23
|
+
gem.extra_rdoc_files = %w(README.md CHANGELOG.md CONTRIBUTING.md)
|
|
26
24
|
gem.test_files = Dir.glob('spec/**/*')
|
|
27
25
|
gem.test_files += Dir.glob('features/**/*')
|
|
28
26
|
|
|
29
|
-
gem.required_ruby_version = '>= 2.
|
|
27
|
+
gem.required_ruby_version = '>= 2.2.2'
|
|
30
28
|
|
|
31
29
|
gem.add_dependency 'bindata', '~> 2.1.0'
|
|
32
|
-
gem.add_dependency 'activesupport', '~>
|
|
33
|
-
|
|
34
|
-
gem.add_development_dependency 'bundler', '~> 1.10.6'
|
|
35
|
-
gem.add_development_dependency 'pry', '~> 0.10.3'
|
|
36
|
-
gem.add_development_dependency 'rake'
|
|
37
|
-
|
|
38
|
-
# Guard
|
|
39
|
-
gem.add_development_dependency 'guard', '~> 2.13.0'
|
|
40
|
-
gem.add_development_dependency 'guard-bundler', '~> 2.1.0'
|
|
41
|
-
gem.add_development_dependency 'guard-cucumber', '~> 1.6.0'
|
|
42
|
-
gem.add_development_dependency 'guard-rspec', '~> 4.6.4'
|
|
43
|
-
gem.add_development_dependency 'guard-rubocop', '~> 1.2.0'
|
|
44
|
-
gem.add_development_dependency 'rb-fchange', '~> 0.0.6'
|
|
45
|
-
gem.add_development_dependency 'rb-fsevent', '~> 0.9.6'
|
|
46
|
-
gem.add_development_dependency 'rb-inotify', '~> 0.9.5'
|
|
47
|
-
gem.add_development_dependency 'terminal-notifier-guard', '~> 1.6.4'
|
|
48
|
-
|
|
49
|
-
# Docs
|
|
50
|
-
gem.add_development_dependency 'inch', '~> 0.7.0'
|
|
51
|
-
gem.add_development_dependency 'relish', '~> 0.7.1'
|
|
52
|
-
gem.add_development_dependency 'yard', '~> 0.8.7.6'
|
|
53
|
-
|
|
54
|
-
# Test
|
|
55
|
-
gem.add_development_dependency 'codeclimate-test-reporter', '~> 0.4.8'
|
|
56
|
-
gem.add_development_dependency 'coveralls', '~> 0.8.3'
|
|
57
|
-
gem.add_development_dependency 'cucumber', '~> 2.1.0'
|
|
58
|
-
gem.add_development_dependency 'flay', '~> 2.6.1'
|
|
59
|
-
gem.add_development_dependency 'flog', '~> 4.3.2'
|
|
60
|
-
gem.add_development_dependency 'reek', '~> 3.6.0'
|
|
61
|
-
gem.add_development_dependency 'rspec', '~> 3.3.0'
|
|
62
|
-
gem.add_development_dependency 'rspec-given', '~> 3.7.1'
|
|
63
|
-
gem.add_development_dependency 'rubocop', '~> 0.34.2'
|
|
30
|
+
gem.add_dependency 'activesupport', '~> 5.0.2'
|
|
64
31
|
end
|